Hadoop中的内存不足错误

时间:2011-12-11 12:42:22

标签: java hadoop

我尝试按照此http://hadoop.apache.org/common/docs/stable/single_node_setup.html文档安装Hadoop。 当我尝试执行此

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)

16 个答案:

答案 0 :(得分:77)

对于使用RPM或DEB软件包的任何人来说,文档和常见建议都会产生误导。这些包将hadoop配置文件安装到/ etc / hadoop中。这些将优先于其他设置。

/etc/hadoop/hadoop-env.sh设置Hadoop的最大Java堆内存,默认为:

   export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"

此Xmx设置太低,只需将其更改为此并重新运行

   export HADOOP_CLIENT_OPTS="-Xmx2048m $HADOOP_CLIENT_OPTS"

答案 1 :(得分:39)

您可以通过编辑conf / mapred-site.xml文件并添加属性来分配更多内存:

  <property>
    <name>mapred.child.java.opts</name>
    <value>-Xmx1024m</value>
  </property>

这将启动具有更多堆空间的hadoop JVM。

答案 2 :(得分:12)

另一种可能性是编辑hadoop-env.sh,其中包含export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"。 在我的情况下改变128m到1024m(Debian上的Hadoop 1.0.0.1)。

答案 3 :(得分:6)

在尝试了这么多组合之后,最后我在我的环境(Ubuntu 12.04,Hadoop 1.0.4)上得出同样的错误是由于两个问题。

  1. 与上面提到的Zach Gamer相同。
  2. 不要忘记先执行“ssh localhost”。信不信由你!没有ssh也会在Java堆空间上抛出错误消息。

答案 4 :(得分:5)

您需要对mapreduce.{map|reduce}.java.opts以及mapreduce.{map|reduce}.memory.mb进行调整。

例如:

  hadoop jar <jarName> <fqcn> \
      -Dmapreduce.map.memory.mb=4096 \
      -Dmapreduce.map.java.opts=-Xmx3686m

here是回答这个问题的好资源

答案 5 :(得分:4)

您可以通过编辑文件/etc/hadoop/hadoop-env.sh来解决此问题。

Hadoop正在给conf目录提供/ etc / hadoop conf目录优先级。

我也遇到了同样的情况。

答案 6 :(得分:2)

运行你的工作,如下所示:

bin/hadoop jar hadoop-examples-*.jar grep -D mapred.child.java.opts=-Xmx1024M input output 'dfs[a-z.]+' 

默认情况下,堆空间设置为32MB或64MB。您可以增加属性文件中的堆空间,如Tudor所指出的那样,或者您可以通过为此特定作业设置此属性来更改此特定作业的堆空间。

答案 7 :(得分:2)

我从二进制tar安装了hadoop 1.0.4并且出现了内存不足的问题。我尝试了Tudor's,Zach Garner,Nishant Nagwani和Andris Birkmanis的解决方案,但没有一个能为我工作。

编辑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 "
...

我假设有更好的方法可以做到这一点,但我找不到它。

答案 8 :(得分:2)

与Ubuntu,Hadoop 1.1.1相同的例外。解决方案很简单 - 编辑由某些init脚本设置的shell变量$ HADOOP_CLIENT_OPTS。但是花了很长时间才找到它=(

答案 9 :(得分:2)

我们遇到了同样的情况。

为我修改hadoop-env.sh

EXPORT HADOOP_HEAPSIZE会被评论,取消评论&amp;提供您选择的尺寸。

默认HEAPSIZE已分配为1000MB。

答案 10 :(得分:1)

为您的映射配置JVM堆大小并减少进程。这些大小必须小于您在上一节中配置的物理内存。通常,它们应为YARN物理内存设置的80%。

配置mapreduce.map.java.optsmapreduce.reduce.java.opts分别设置映射并减小堆大小,例如

<property>  
   <name>mapreduce.map.java.opts</name>  
   <value>-Xmx1638m</value>
</property>
<property>  
   <name>mapreduce.reduce.java.opts</name>  
   <value>-Xmx3278m</value>
</property>

答案 11 :(得分:0)

通过运行以下命令导出变量对我有用:

. conf/hadoop-env.sh

答案 12 :(得分:0)

在使用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中更改HADOOP_CLIENT_OPTIONS的值时,我不再遇到奇怪的问题(因为每次运行hadoop-env.sh脚本时,客户端选项环境变量已更新,但保留旧值)

答案 13 :(得分:0)

上周我结束了一个非常类似的问题。我正在使用的输入文件中有一个很大的屁股线,我无法查看。这条线几乎是我文件大小的95%(1gb的95%!想象一下!)。我建议你先看看输入文件。您可能遇到了要查看的格式错误的输入文件。检查输入文件后尝试增加堆空间。

答案 14 :(得分:0)

确保mapreduce.child.java.opts有足够的内存来运行mapred作业。同时确保mapreduce.task.io.sort.mb应小于mapreduce.child.java.opts

示例:

 mapreduce.child.java.opts=Xmx2048m

 mapreduce.task.io.sort.mb=100

否则,即使hadoop-env.sh中的HADOOP_CLIENT_OPTS有足够的内存(如果已配置),您也会遇到OOM问题。

答案 15 :(得分:0)

如果您在Amazon EMR上使用Hadoop,则可以添加配置以增加堆大小:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
EXPOSE 80
EXPOSE 443

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /DIRPATH
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "Creator.Demo.dll"]