レデューサーで次の例外が発生しています。
EMFILE: Too many open files
at org.apache.hadoop.io.nativeio.NativeIO.open(Native Method)
at org.apache.hadoop.io.SecureIOUtils.createForWrite(SecureIOUtils.java:161)
at org.apache.hadoop.mapred.TaskLog.writeToIndexFile(TaskLog.java:296)
at org.apache.hadoop.mapred.TaskLog.syncLogs(TaskLog.java:369)
at org.apache.hadoop.mapred.Child$4.run(Child.java:257)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
レデューサーあたり約 10,000 個のファイルが作成されています。各ボックスの ulimit を設定する方法はありますか。
次のコマンドをブートストラップ スクリプトとして使用してみました: ulimit -n 1000000
しかし、これはまったく役に立ちませんでした。
/usr/lib/hadoop/hadoop-daemon.sh の ulimit コマンドを置き換えるために、ブートストラップ アクションで次のことも試しました。
#!/bin/bash
set -e -x
sudo sed -i -e "/^ulimit /s|.*|ulimit -n 134217728|" /usr/lib/hadoop/hadoop-daemon.sh
しかし、それでもマスターノードにログインすると、ulimit -n が 32768 を返すことがわかります。また、/usr/lib/hadoop/hadoop-daemon.sh で目的の変更が行われ、ulimit -n があったことも確認しました。 134217728。
このための Hadoop 構成はありますか? または、これに対する回避策はありますか?
私の主な目的は、各レコードの ID に従ってレコードをファイルに分割することです。現在、15 億のレコードがあり、確実に増加する可能性があります。
このデーモンが各スレーブで実行される前に、このファイルを編集する方法はありますか?