Java Hadoop中的内存不足错误
我试着按照这个文档安装Hadoop。 当我试着执行这个的时候Java Hadoop中的内存不足错误,java,hadoop,Java,Hadoop,我试着按照这个文档安装Hadoop。 当我试着执行这个的时候 bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 我得到以下异常 java.lang.OutOfMemoryError: Java heap space 请提出一个解决方案,以便我可以尝试这个例子。下面列出了整个例外情况。我是Hadoop新手,我可能做了一些愚蠢的事情。如有任何建议,将不胜感激 anuj@anuj-VPCEA13EN:~/had
bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
我得到以下异常
java.lang.OutOfMemoryError: Java heap space
请提出一个解决方案,以便我可以尝试这个例子。下面列出了整个例外情况。我是Hadoop新手,我可能做了一些愚蠢的事情。如有任何建议,将不胜感激
anuj@anuj-VPCEA13EN:~/hadoop$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
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)
anuj@anuj-VPCEA13EN:~/hadoop$bin/hadoop jar hadoop示例-*.jar grep输入输出'dfs[a-z.]+'
11/12/11 17:38:22 INFO util.NativeCodeLoader:加载了本机hadoop库
11/12/11 17:38:22信息映射。文件输入格式:要处理的总输入路径:7
11/12/11 17:38:22信息映射。作业客户端:正在运行作业:作业\u本地\u 0001
11/12/11 17:38:22 INFO util.ProcessTree:setsid已退出,退出代码为0
11/12/11 17:38:22信息映射。任务:使用ResourceCalculatorPlugin:org.apache.hadoop.util。LinuxResourceCalculatorPlugin@e49dcd
11/12/11 17:38:22信息映射。映射任务:numReduceTasks:1
11/12/11 17:38:22 INFO mapred.MapTask:io.sort.mb=100
11/12/11 17:38:22警告映射。本地JobRunner:job\u local\u 0001
java.lang.OutOfMemoryError:java堆空间
位于org.apache.hadoop.mapred.MapTask$MapOutputBuffer。(MapTask.java:949)
位于org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:428)
位于org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
位于org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
11/12/11 17:38:23信息映射。作业客户端:映射0%减少0%
11/12/11 17:38:23信息映射。JobClient:作业完成:作业\u本地\u 0001
11/12/11 17:38:23信息映射。作业客户端:计数器:0
11/12/11 17:38:23信息映射。作业客户端:作业失败:NA
java.io.IOException:作业失败!
位于org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1257)
位于org.apache.hadoop.examples.Grep.run(Grep.java:69)
位于org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
位于org.apache.hadoop.examples.Grep.main(Grep.java:93)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)
位于org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:139)
位于org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:64)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.apache.hadoop.util.RunJar.main(RunJar.java:156)
您可以通过编辑conf/mapred-site.xml文件并添加以下属性来分配更多内存:
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
mapred.child.java.opts
-Xmx1024m
这将使用更多堆空间启动hadoop JVM。按如下方式运行作业:
bin/hadoop jar hadoop-examples-*.jar grep -D mapred.child.java.opts=-Xmx1024M input output 'dfs[a-z.]+'
堆空间默认设置为32MB或64MB。Tudor指出,您可以增加属性文件中的堆空间,也可以通过为此特定作业设置此属性来更改此特定作业的堆空间。另一种可能是编辑
hadoop env.sh
,其中包含导出hadoop\u CLIENT\u OPTS=“-Xmx128m$hadoop\u CLIENT\u OPTS”
。
将128m更改为1024m对我的情况很有帮助(Debian上的Hadoop 1.0.0.1)。您可以通过编辑文件
/etc/Hadoop/Hadoop env.sh
来解决此问题
Hadoop赋予/etc/Hadoop config目录优先于conf目录
我也遇到了同样的情况。对于任何使用RPM或DEB软件包的人来说,文档和常见建议都是误导性的。这些包将hadoop配置文件安装到/etc/hadoop中。这些设置将优先于其他设置 /etc/hadoop/hadoop-env.sh设置hadoop的最大java堆内存,默认为:
export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS" export HADOOP_CLIENT_OPTS=“-Xmx128m$HADOOP_CLIENT_OPTS” 此Xmx设置太低,只需将其更改为此,然后重新运行
export HADOOP_CLIENT_OPTS="-Xmx2048m $HADOOP_CLIENT_OPTS"
export HADOOP_CLIENT_OPTS=“-Xmx2048m$HADOOP_CLIENT_OPTS”我从二进制tar安装了HADOOP 1.0.4,出现了内存不足问题。我试过都铎、扎克·加纳、尼桑·纳格瓦尼和安德里斯·伯克曼尼斯的解决方案,但都不适合我 编辑bin/hadoop以忽略$hadoop_CLIENT_选项对我来说很有用:
...
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 "
...
. conf/hadoop-env.sh
我假设有更好的方法可以做到这一点,但我找不到。在尝试了这么多组合之后,最后我得出结论,我的环境(Ubuntu 12.04,Hadoop 1.0.4)上的相同错误是由于两个问题造成的
Ubuntu也有同样的例外,Hadoop 1.1.1。解决方案很简单——编辑shell变量$HADOOP\u CLIENT\u OPTS,由一些init脚本设置。但是我们花了很长时间才找到答案,我们面临着同样的情况 修改hadoop env.sh对我来说是可行的
EXPORT HADOOP\u HEAPSIZE
将被注释,取消注释并提供您选择的大小
默认情况下,
HEAPSIZE
assigned为1000MB。通过运行以下命令导出变量对我有效:
...
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 "
...
. conf/hadoop-env.sh
在使用DEB安装的Ubuntu上(至少对于Hadoop 1.2.1),有一个
/etc/profile.d/Hadoop env.sh
符号链接被创建为/etc/Hadoop/Hadoop env.sh
,这会导致每次登录时加载它。根据我的经验,这不是必需的,因为/usr/bin/Hadoop
包装器本身最终会调用它(通过/usr/libexec/hadoop config.sh
)。在我的系统上,我删除了符号链接,并且在更改-Xmx<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1638m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx3278m</value>
</property>
[
{
"Classification": "hadoop-env",
"Properties": {},
"Configurations": [
{
"Classification": "export",
"Properties": {
"HADOOP_HEAPSIZE": "2048"
},
"Configurations": []
}
]
}
]