先日導入した 24 CPUコア搭載マシン(
Xeon E5-2697v2 搭載24コアマシンの性能と消費電力をチェック - 生物物理計算化学者の雛
)で Map スロット数 24 でHadoopジョブを流したところ、Map処理21本は正常に流れるが、残り3本はエラーで停止してブラックリスト入りする状態になってしまいました。
エラーメッセージは以下の通りです。(CentOS 6.2、Hadoop version 0.21.0)
java.lang.Throwable: Child Error at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:249) Caused by: java.io.IOException: Task process exit with nonzero status of 134. at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:236) , java.lang.Throwable: Child Error at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:249) Caused by: java.io.IOException: Task process exit with nonzero status of 1. at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:236)
何度繰り返しても21本は動いて3本はエラーになるため、設定に問題があると考えいろいろ試行錯誤したところ、ユーザプロセス数を増やすことで期待通り24本のMap処理が走るようになることがわかりました。
なお、ファイルディスクリプタについては既にデフォルトの1024から増やしてありました。(参考:
Hadoopクラスタでulimitを設定するときの注意点 - tagomorisのメモ置き場、/etc/security/limits.confのnofileプロパティを増やせばよい)
ユーザプロセス数の設定は /etc/security/limits.d/90-nproc.conf ファイルを書き換ることでできます。
# Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. * soft nproc 1024
デフォルトでは上限が1024になっているので、これを8192のように大きな値に書き換え、マシンを再起動(再起動しなくても再ログインでもOKかも?)することでユーザプロセス数上限を増やすことができました。
上限値が変更されているかどうかはルート権限で「ulimit -a」を実行することで以下のように確認できます。
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 256445 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 32768 # ファイルディスクリプタ、デフォルト1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) 8192 # ユーザプロセス数、デフォルト1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited