4

レデューサーで次の例外が発生しています。

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 億のレコードがあり、確実に増加する可能性があります。

このデーモンが各スレーブで実行される前に、このファイルを編集する方法はありますか?

4

4 に答える 4

3

OK、Amazon EMR のセットアップでデフォルトで設定されている ulimit のようです: 32768 はすでに多すぎます。ジョブでこれ以上の値が必要な場合は、ロジックを再検討する必要があります。したがって、すべてのファイルを直接 s3 に書き込むのではなく、ローカルに書き込み、1024 個のファイルのバッチで s3 に移動しました。これで問題は解決too many open filesしました。

おそらく、ファイル記述子が s3 への書き込みのために開かれたとき、ローカル ファイルに書き込まれたときのように解放/閉じられませんでした。これに対するより良い説明は大歓迎です。

于 2012-12-16T21:22:37.373 に答える
0

ブートストラップ アクション、特に事前定義されたものの 1 つを介してこれを行う方法があるかもしれません。また、事前定義が機能しない場合は、カスタム スクリプトを使用して、任意の Linux クラスターで通常実行できることを実行できます。しかし、最初に、なぜそんなに多くのファイルを出力しているのかお尋ねします。HDFS/Hadoop は、少数の大きなファイル向けに最適化されていることは間違いありません。なんらかの索引付けを行いたい場合、生のファイルを別の名前で書き出すのはおそらく最善の方法ではありません。

于 2012-10-19T23:51:04.727 に答える
0

ここでの正しい解決策は、単一のシーケンス ファイルを用意することだと思います。その内容は、ファイル名でキー付けされた各バイナリ ファイルです。レコードをファイルに分割しても問題ありませんが、これらのファイルはファイル名でキー付けされた BLOB として 1 つの大きなシーケンス ファイルに保存できます。

于 2012-10-19T23:57:45.340 に答える
-1

この問題が発生しましたが、Linuxの設定です。

ここに移動して解決し、次の手順に従います。

http://www.cyberciti.biz/faq/linux-unix-nginx-too-many-open-files/

于 2012-10-18T11:13:31.783 に答える