Java 8でHadoopを動かしていたハマった点です。
エラー事象
非力なノートPCで動かすために、各プロセスのヒープサイズを軒並み下げてから実行しようとしたのですが、いつものPi計算MRジョブを実行しようとして以下のエラーにハマリました。
15/09/02 22:49:41 INFO mapreduce.Job: Job job_1441201719441_0001 failed with state FAILED due to: Application application_1441201719441_0001 failed 2 times due to AM Container for appattempt_1441201719441_0001_000002 exited with exitCode: -103
For more detailed output, check application tracking page:http://localhost:8088/cluster/app/application_1441201719441_0001Then, click on links to logs of each attempt.
Diagnostics: Container [pid=39344,containerID=container_1441201719441_0001_02_000001] is running beyond virtual memory limits. Current usage: 71 MB of 1 GB physical memory used; 2.7 GB of 2.1 GB virtual memory used. Killing container.
なんじゃこのエラーは...
ん?
Current usage: 71 MB of 1 GB physical memory used; 2.7 GB of 2.1 GB virtual memory used.
( ゚д゚)
(つд⊂)ゴシゴシ
(;゚д゚)
(つд⊂)ゴシゴシ
, .
(;゚ Д゚)
えっ、virtual memoryが2.7GB!?
そりゃ、だめだ。
原因
職場の有識者の人に聞いたら、「Java 8からVirtual memoryの使用量が大きくなったんですよー」とのこと。
知らなかった。。。
どうやらクラスやメソッドをノードしていた領域がヒープ領域からネイティブ領域に移動されたことが主な原因のようです。
ググってみつけた以下のブログがわかりやすかったです。
Java8のHotSpotVMからPermanent領域が消えた理由とその影響
http://equj65.net/tech/java8hotspot/
MaxPermSizeオプションが使えなくなるという形で気づくひとが多いみたいですね。
Java 8からはMaxMetaspaceSizeで指定せいや、とのこと。
対策
HadoopのJIRAだと以下チケットにて報告されています。
https://issues.apache.org/jira/browse/HADOOP-11364
- JVMオプションにて以下でネイティブ領域の使用最大量を制限する
- -XX:ReservedCodeCacheSize
- -XX:MaxMetaspaceSize
- -XX:CompressedClassSpaceSize
- Hadoopのvirtual memory チェック機構を無効化する:
yarn-site.xmlにてyarn.nodemanager.vmem-check-enabledをfalseに - Hadoopのvirtual memory チェックのしきい値を上げる:
yarn-site.xmlにてyarn.nodemanager.vmem-pmem-ratioの値をデフォルトの2.1より大きくする(エラーがでなくなるまで)
どれかで対応する感じみたいです。
とりあえず1つ目の対処でエラーが出なくなったのでよしとします。