Hadoop中的内存不足错误
我尝试在这个http://hadoop.apache.org/common/docs/stable/single_node_setup.html文档之后安装Hadoop。 当我尝试执行这个
bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[az.]+'
我收到以下exception
java.lang.OutOfMemoryError: Java heap space
请build议一个解决scheme,以便我可以尝试这个例子。 下面列出了整个例外。 我是Hadoop的新手我可能做了一些愚蠢的事情。 任何build议将不胜感激。
anuj@anuj-VPCEA13EN:~/hadoop$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[az.]+' 11/12/11 17:38:22 INFO util.NativeCodeLoader: Loaded the native-hadoop library 11/12/11 17:38:22 INFO mapred.FileInputFormat: Total input paths to process : 7 11/12/11 17:38:22 INFO mapred.JobClient: Running job: job_local_0001 11/12/11 17:38:22 INFO util.ProcessTree: setsid exited with exit code 0 11/12/11 17:38:22 INFO mapred.Task: Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@e49dcd 11/12/11 17:38:22 INFO mapred.MapTask: numReduceTasks: 1 11/12/11 17:38:22 INFO mapred.MapTask: io.sort.mb = 100 11/12/11 17:38:22 WARN mapred.LocalJobRunner: job_local_0001 java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:949) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:428) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372) at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212) 11/12/11 17:38:23 INFO mapred.JobClient: map 0% reduce 0% 11/12/11 17:38:23 INFO mapred.JobClient: Job complete: job_local_0001 11/12/11 17:38:23 INFO mapred.JobClient: Counters: 0 11/12/11 17:38:23 INFO mapred.JobClient: Job Failed: NA java.io.IOException: Job failed! at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1257) at org.apache.hadoop.examples.Grep.run(Grep.java:69) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) at org.apache.hadoop.examples.Grep.main(Grep.java:93) 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.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68) at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:139) at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:64) 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:156)
您可以通过编辑conf / mapred-site.xml文件并添加属性来分配更多内存:
<property> <name>mapred.child.java.opts</name> <value>-Xmx1024m</value> </property>
这将启动具有更多堆空间的hadoop JVM。
对于任何使用RPM或DEB软件包的人来说,文档和常见的build议都是有误导性的。 这些软件包将hadoopconfiguration文件安装到/ etc / hadoop中。 这些将优先于其他设置。
/etc/hadoop/hadoop-env.sh设置Hadoop的最大java堆内存,默认情况下是:
导出HADOOP_CLIENT_OPTS =“ - Xmx128m $ HADOOP_CLIENT_OPTS”
这Xmx设置太低,只需将其更改为此并重新运行
导出HADOOP_CLIENT_OPTS =“ - Xmx2048m $ HADOOP_CLIENT_OPTS”
另一种可能是编辑hadoop-env.sh
,其中包含export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"
。 在我的情况下,将128m改为1024m(Debian上的Hadoop 1.0.0.1)。
在尝试了这么多的组合之后,最后我得出了和我的环境(Ubuntu 12.04,Hadoop 1.0.4)相同的错误是由于两个问题。
- 和上面提到的Zach Gamer一样。
- 不要忘记先执行“ssh localhost”。 信不信由你! 没有ssh也会在Java堆空间上抛出错误信息。
你可以通过编辑文件/etc/hadoop/hadoop-env.sh
来解决这个问题。
Hadoop将conf / etc / hadoopconfiguration目录优先于conf目录。
我也遇到了同样的情况。
您需要调整mapreduce.{map|reduce}.java.opts
以及mapreduce.{map|reduce}.memory.mb
。
例如:
hadoop jar <jarName> <fqcn> \ -Dmapreduce.map.memory.mb=4096 \ -Dmapreduce.map.java.opts=-Xmx3686m
这里是回答这个问题的好资源
运行你的工作,如下所示:
bin/hadoop jar hadoop-examples-*.jar grep -D mapred.child.java.opts=-Xmx1024M input output 'dfs[az.]+'
堆空间默认设置为32MB或64MB。 您可以像Tudor指出的那样增加属性文件中的堆空间,或者通过为这个特定的工作设置这个属性来改变这个特定的工作。
我从二进制tar安装hadoop 1.0.4,并有内存不足的问题。 我尝试了都铎王朝,Zach Garner,Nishant Nagwani和Andris Birkmanis的解决scheme,但都没有为我工作。
编辑bin / hadoop忽略$ HADOOP_CLIENT_OPTS为我工作:
... elif [ "$COMMAND" = "jar" ] ; then CLASS=org.apache.hadoop.util.RunJar #Line changed this line to avoid out of memory error: #HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS" # changed to: HADOOP_OPTS="$HADOOP_OPTS " ...
我假设有一个更好的方法来做到这一点,但我找不到它。
Ubuntu和Hadoop 1.1.1也是一样的例外。 解决scheme很简单 – 编辑由某个初始化脚本设置的shellvariables$ HADOOP_CLIENT_OPTS。 但花了很长时间才find它=
我们面临同样的情况。
修改hadoop-env.sh
为我工作。
EXPORT HADOOP_HEAPSIZE
将被评论,取消注释并提供您select的大小。
默认HEAPSIZE
分配为1000MB。
通过运行以下命令导出variables为我工作:
. conf/hadoop-env.sh
在使用DEB安装的Ubuntu(至less是Hadoop 1.2.1)上,有一个/etc/profile.d/hadoop-env.sh
符号链接创build到/etc/hadoop/hadoop-env.sh
,这会导致它每次加载login。根据我的经验,这是不必要的,因为/usr/bin/hadoop
包装本身最终会调用它(通过/usr/libexec/hadoop-config.sh
)。 在我的系统上,我已经删除了符号链接,在HADOOP_CLIENT_OPTIONS
更改-Xmx
的值时,我不再发生奇怪的问题(因为每次hadoop-env.sh
脚本运行时,客户机选项环境variables都会更新,旧值)
上周我结束了一个非常类似的问题。 我使用的input文件有一个很大的屁股线,我不能查看。 该行几乎是我的文件大小的95%(95%的1GB!想象!)。 我build议你先看看你的input文件。 你可能有一个格式不正确的input文件,你想看看。 检查input文件后,尝试增加堆空间。
确保mapreduce.child.java.opts
具有足够的内存来运行映射作业。 还要确保mapreduce.task.io.sort.mb
应该小于mapreduce.child.java.opts
。
例:
mapreduce.child.java.opts=Xmx2048m mapreduce.task.io.sort.mb=100
否则,你会遇到OOM问题,即使hadoop-env.sh中的HADOOP_CLIENT_OPTS有足够的内存,如果configuration。