これに続いて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)
Conf/mapred-site.xmlファイルを編集してプロパティを追加することにより、より多くのメモリを割り当てることができます。
<property>
<name>mapred.child.Java.opts</name>
<value>-Xmx1024m</value>
</property>
これにより、より多くのヒープスペースを持つhadoop JVMが起動します。
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 "
別の可能性は、編集hadoop-env.sh
、 を含む export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"
。私の場合、128mから1024mに変更するのが助けになりました(DebianのHadoop 1.0.0.1)。
非常に多くの組み合わせを試した後、2つの問題が原因で、環境(Ubuntu 12.04、Hadoop 1.0.4)で同じエラーが発生したと最終的に判断しました。
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 は、この質問への回答を含む良いリソースです
ファイル/etc/hadoop/hadoop-env.sh
を編集することにより、この問題を解決できます。
Hadoopは、/ etc/hadoop configディレクトリをconfディレクトリよりも優先させていました。
私も同じ状況に会いました。
Ubuntuと同じ例外、Hadoop 1.1.1。解決策は簡単でした。初期化スクリプトによって設定されたシェル変数$ HADOOP_CLIENT_OPTSを編集します。しかし、それを見つけるのに長い時間がかかりました=(
同じ状況に直面しました。
hadoop-env.sh
を変更するとうまくいきました。
EXPORT HADOOP_HEAPSIZE
はコメントされ、コメントを外し、選択したサイズを提供します。
デフォルトでは、割り当てられたHEAPSIZE
は1000MBです。
以下のようなジョブを実行します。
bin/hadoop jar hadoop-examples-*.jar grep -D mapred.child.Java.opts=-Xmx1024M input output 'dfs[a-z.]+'
ヒープ領域は、デフォルトで32MBまたは64MBに設定されています。 Tudorが指摘したように、プロパティファイルのヒープスペースを増やすか、この特定のジョブにこのプロパティを設定して、この特定のジョブのヒープスペースを変更できます。
バイナリ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 "
...
私はこれを行うためのより良い方法があると仮定していますが、見つけることができませんでした。
マップの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>
次のコマンドを実行して変数をエクスポートするとうまくいきました:
. conf/hadoop-env.sh
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
スクリプトが実行され、クライアントオプションの環境変数が更新されますが、古い値は保持されます)
mapreduce.child.Java.opts
に、マップされたジョブを実行するために必要な十分なメモリがあることを確認してください。また、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の問題が発生します。
先週、非常によく似た問題が発生しました。使用していた入力ファイルには、表示できない大きなお尻の行がありました。その行は、ファイルサイズのほぼ95%でした(1 GBの95%!想像してみてください!)。最初に入力ファイルを確認することをお勧めします。不正な形式の入力ファイルがあり、それを調べたい可能性があります。入力ファイルを確認した後、ヒープ領域を増やしてみてください。