web-dev-qa-db-ja.com

Hadoopのメモリ不足エラー

これに続いてHadoopをインストールしてみました http://hadoop.Apache.org/common/docs/stable/single_node_setup.html document。これを実行してみたとき

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)
58
Anuj

Conf/mapred-site.xmlファイルを編集してプロパティを追加することにより、より多くのメモリを割り当てることができます。

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

これにより、より多くのヒープスペースを持つhadoop JVMが起動します。

39
Tudor

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 "
78
Zach Garner

別の可能性は、編集hadoop-env.sh、 を含む export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"。私の場合、128mから1024mに変更するのが助けになりました(DebianのHadoop 1.0.0.1)。

12

非常に多くの組み合わせを試した後、2つの問題が原因で、環境(Ubuntu 12.04、Hadoop 1.0.4)で同じエラーが発生したと最終的に判断しました。

  1. 上記のZach Gamerと同じです。
  2. 最初に「ssh localhost」を実行することを忘れないでください。信じるかどうかは勝手だけど! sshは、Javaヒープスペースにもエラーメッセージをスローしません。
6
etlolap

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
tworec

ファイル/etc/hadoop/hadoop-env.shを編集することにより、この問題を解決できます。

Hadoopは、/ etc/hadoop configディレクトリをconfディレクトリよりも優先させていました。

私も同じ状況に会いました。

4
wufawei

Ubuntuと同じ例外、Hadoop 1.1.1。解決策は簡単でした。初期化スクリプトによって設定されたシェル変数$ HADOOP_CLIENT_OPTSを編集します。しかし、それを見つけるのに長い時間がかかりました=(

2
Odysseus

同じ状況に直面しました。

hadoop-env.shを変更するとうまくいきました。

EXPORT HADOOP_HEAPSIZEはコメントされ、コメントを外し、選択したサイズを提供します。

デフォルトでは、割り当てられたHEAPSIZEは1000MBです。

2
Mitra Bhanu

以下のようなジョブを実行します。

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

ヒープ領域は、デフォルトで32MBまたは64MBに設定されています。 Tudorが指摘したように、プロパティファイルのヒープスペースを増やすか、この特定のジョブにこのプロパティを設定して、この特定のジョブのヒープスペースを変更できます。

2
Nishant Nagwani

バイナリtarからhadoop 1.0.4をインストールしましたが、メモリ不足の問題がありました。チューダー、ザック・ガーナー、ニシャン・ナグワニ、アンドリス・バークマニスのソリューションを試しましたが、どれもうまくいきませんでした。

$ HADOOP_CLIENT_OPTSを無視するようにbin/hadoopを編集するとうまくいきました:

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

私はこれを行うためのより良い方法があると仮定していますが、見つけることができませんでした。

2
Brian C.

マップのJVMヒープサイズを構成し、プロセスを削減します。これらのサイズは、前のセクションで構成した物理メモリよりも小さくする必要があります。一般的なルールとして、それらはYARN物理メモリ設定のサイズの80%でなければなりません。

構成、設定 mapreduce.map.Java.optsおよびmapreduce.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>
1
Pravat Sutar

次のコマンドを実行して変数をエクスポートするとうまくいきました:

. conf/hadoop-env.sh
0
Satyajit Rai

DEBインストール(少なくともHadoop 1.2.1の場合)を使用するUbuntuには、/etc/profile.d/hadoop-env.shシンボリックリンクが/etc/hadoop/hadoop-env.shこれにより、ログインするたびにロードされます。私の経験では、これは/usr/bin/hadoopラッパー自体は最終的にそれを呼び出します(/usr/libexec/hadoop-config.sh)。私のシステムでは、シンボリックリンクを削除したため、-Xmx in HADOOP_CLIENT_OPTIONS(そのたびにhadoop-env.shスクリプトが実行され、クライアントオプションの環境変数が更新されますが、古い値は保持されます)

0
borice

mapreduce.child.Java.optsに、マップされたジョブを実行するために必要な十分なメモリがあることを確認してください。また、mapreduce.task.io.sort.mbmapreduce.child.Java.optsよりも小さいことを確認してください。

例:

 mapreduce.child.Java.opts=Xmx2048m

 mapreduce.task.io.sort.mb=100

そうしないと、hadoop-env.shのHADOOP_CLIENT_OPTSに十分なメモリが設定されていても、OOMの問題が発生します。

0
S.K. Venkat

先週、非常によく似た問題が発生しました。使用していた入力ファイルには、表示できない大きなお尻の行がありました。その行は、ファイルサイズのほぼ95%でした(1 GBの95%!想像してみてください!)。最初に入力ファイルを確認することをお勧めします。不正な形式の入力ファイルがあり、それを調べたい可能性があります。入力ファイルを確認した後、ヒープ領域を増やしてみてください。

0
Adi Kish