Hi, I got it, it should be declared in the
enhadoop-env.sh
export HADOOP_CLIENT_OPTS=-Xmx4000m
Thanks! At the same time I see corrections come in.
Shi
On 2010-10-13 18:18, Shi Yu wrote:
Hi, I tried the following five ways:
Approach 1: in command line
HADOOP_CLIENT_OPTS=-Xmx4000m bin/hadoop jar WordCount.jar OOloadtest
Approach 2: I added the hadoop-site.xml file with the following
element. Each time I changed, I stop and restart hadoop on all the nodes.
...
<property>
<name>HADOOP_CLIENT_OPTS</name>
<value>-Xmx4000m</value>
</property>
run the command
$bin/hadoop jar WordCount.jar OOloadtest
Approach 3: I changed like this
...
<property>
<name>HADOOP_CLIENT_OPTS</name>
<value>4000m</value>
</property>
....
Then run the command:
$bin/hadoop jar WordCount.jar OOloadtest
Approach 4: To make sure, I changed the "m" to numbers, that was
...
<property>
<name>HADOOP_CLIENT_OPTS</name>
<value>4000000000</value>
</property>
....
Then run the command:
$bin/hadoop jar WordCount.jar OOloadtest
All these four approaches come to the same "Java heap space" error.
java.lang.OutOfMemoryError: Java heap space
at
java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:45)
at java.lang.StringBuilder.<init>(StringBuilder.java:68)
at
java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:2997)
at
java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2818)
at
java.io.ObjectInputStream.readString(ObjectInputStream.java:1599)
at
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
at
java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at java.util.HashMap.readObject(HashMap.java:1028)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1846)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at
java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at ObjectManager.loadObject(ObjectManager.java:42)
at OOloadtest.main(OOloadtest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:165)
at org.apache.hadoop.mapred.JobShell.run(JobShell.java:54)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
at org.apache.hadoop.mapred.JobShell.main(JobShell.java:68)
Approach 5:
In comparison, I called the Java command directly as follows (there is
a counter showing how much time it costs if the serialized object is
successfully loaded):
$java -Xms3G -Xmx3G -classpath
.:WordCount.jar:hadoop-0.19.2-core.jar:lib/log4j-1.2.15.jar OOloadtest
return:
object loaded, timing (hms): 0 hour(s) 1 minute(s) 12 second(s)
162millisecond(s)
What was the problem in my command? Where can I find the documentation
about HADOOP_CLIENT_OPTS? Have you tried the same thing and found it
works?
Shi
On 2010-10-13 16:28, Luke Lu wrote:
On Wed, Oct 13, 2010 at 2:21 PM, Shi Yu<sh...@uchicago.edu> wrote:
Hi, thanks for the advice. I tried with your settings,
$ bin/hadoop jar Test.jar OOloadtest -D HADOOP_CLIENT_OPTS=-Xmx4000m
still no effect. Or this is a system variable? Should I export it?
How to
configure it?
HADOOP_CLIENT_OPTS is an environment variable so you should run it as
HADOOP_CLIENT_OPTS=-Xmx1000m bin/hadoop jar Test.jar OOloadtest
if you use sh derivative shells (bash, ksh etc.) prepend env for
other shells.
__Luke
Shi
java -Xms3G -Xmx3G -classpath
.:WordCount.jar:hadoop-0.19.2-core.jar:lib/log4j-1.2.15.jar:lib/commons-collections-3.2.1.jar:lib/stanford-postagger-2010-05-26.jar
OOloadtest
On 2010-10-13 15:28, Luke Lu wrote:
On Wed, Oct 13, 2010 at 12:27 PM, Shi Yu<sh...@uchicago.edu> wrote:
I haven't implemented anything in map/reduce yet for this issue. I
just
try
to invoke the same java class using bin/hadoop command. The
thing is
a
very simple program could be executed in Java, but not doable in
bin/hadoop
command.
If you are just trying to use bin/hadoop jar your.jar command, your
code runs in a local client jvm and mapred.child.java.opts has no
effect. You should run it with HADOOP_CLIENT_OPTS=-Xmx1000m bin/hadoop
jar your.jar
I think if I couldn't get through the first stage, even I had a
map/reduce program it would also fail. I am using Hadoop 0.19.2.
Thanks.
Best Regards,
Shi
On 2010-10-13 14:15, Luke Lu wrote:
Can you post your mapper/reducer implementation? or are you using
hadoop streaming? for which mapred.child.java.opts doesn't apply to
the jvm you care about. BTW, what's the hadoop version you're using?
On Wed, Oct 13, 2010 at 11:45 AM, Shi Yu<sh...@uchicago.edu>
wrote:
Here is my code. There is no Map/Reduce in it. I could run this
code
using
java -Xmx1000m , however, when using bin/hadoop -D
mapred.child.java.opts=-Xmx3000M it has heap space not enough
error.
I
have tried other program in Hadoop with the same settings so the
memory
is
available in my machines.
public static void main(String[] args) {
try{
String myFile = "xxx.dat";
FileInputStream fin = new FileInputStream(myFile);
ois = new ObjectInputStream(fin);
margintagMap = ois.readObject();
ois.close();
fin.close();
}catch(Exception e){
//
}
}
On 2010-10-13 13:30, Luke Lu wrote:
On Wed, Oct 13, 2010 at 8:04 AM, Shi Yu<sh...@uchicago.edu>
wrote:
As a coming-up to the my own question, I think to invoke the
JVM in
Hadoop
requires much more memory than an ordinary JVM.
That's simply not true. The default mapreduce task Xmx is 200M,
which
is much smaller than the standard jvm default 512M and most users
don't need to increase it. Please post the code reading the
object (in
hdfs?) in your tasks.
I found that instead of
serialization the object, maybe I could create a MapFile as an
index
to
permit lookups by key in Hadoop. I have also compared the
performance
of
MongoDB and Memcache. I will let you know the result after I
try the
MapFile
approach.
Shi
On 2010-10-12 21:59, M. C. Srivas wrote:
On Tue, Oct 12, 2010 at 4:50 AM, Shi Yu<sh...@uchicago.edu>
wrote:
Hi,
I want to load a serialized HashMap object in hadoop. The
file of
stored
object is 200M. I could read that object efficiently in
JAVA by
setting
-Xmx
as 1000M. However, in hadoop I could never load it into
memory.
The
code
is
very simple (just read the ObjectInputStream) and there is
yet no
map/reduce
implemented. I set the mapred.child.java.opts=-Xmx3000M,
still
get
the
"java.lang.OutOfMemoryError: Java heap space" Could anyone
explain
a
little
bit how memory is allocate to JVM in hadoop. Why hadoop
takes up
so
much
memory? If a program requires 1G memory on a single node, how
much
memory
it requires (generally) in Hadoop?
The JVM reserves swap space in advance, at the time of
launching the
process. If your swap is too low (or do not have any swap
configured),
you
will hit this.
Or, you are on a 32-bit machine, in which case 3G is not
possible in
the
JVM.
-Srivas.
Thanks.
Shi
--
--
Postdoctoral Scholar
Institute for Genomics and Systems Biology
Department of Medicine, the University of Chicago
Knapp Center for Biomedical Discovery
900 E. 57th St. Room 10148
Chicago, IL 60637, US
Tel: 773-702-6799
--
Postdoctoral Scholar
Institute for Genomics and Systems Biology
Department of Medicine, the University of Chicago
Knapp Center for Biomedical Discovery
900 E. 57th St. Room 10148
Chicago, IL 60637, US
Tel: 773-702-6799