2017-06-22 14 views
0

spark2でバッチジョブを実行しようとしていますが、巨大なリストを入力として受け取り、リストを反復処理して処理します。プログラムは約8000レコードのリストを実行してから正常に実行され、その後例外が発生します。spark(java) - 開いているファイルが多すぎます

WARN Lost task 0.0 in stage 421079.0 (TID 996338, acusnldlenhww4.cloudapp.net, executor 1): java.io.FileNotFoundException: /data/1/hadoop/yarn/local/usercache/A2159537-MSP01/appcache/application_1497532405817_0072/blockmgr-73dc563c-8ea5-4f2d-adfe-6c60cf3e3968/0d/shuffle_145960_0_0.index.cfb6d5ea-8c7b-41a1-acc3-2c840e7f8998 (Too many open files) 
     at java.io.FileOutputStream.open0(Native Method) 
     at java.io.FileOutputStream.open(FileOutputStream.java:270) 
     at java.io.FileOutputStream.<init>(FileOutputStream.java:213) 
     at java.io.FileOutputStream.<init>(FileOutputStream.java:162) 
     at org.apache.spark.shuffle.IndexShuffleBlockResolver.writeIndexFileAndCommit(IndexShuffleBlockResolver.scala:144) 
     at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:128) 
     at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96) 
     at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53) 
     at org.apache.spark.scheduler.Task.run(Task.scala:99) 
     at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:322) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
    (org.apache.spark.scheduler.TaskSetManager) 

neo4jデータベースが入力として使用されます。私は入力としてneo4jから300kノードを読み込み、入力rddに対してforループを実行しています。

試し設定SparkConfのspark.shuffle.consolidateFilestrueです。しかし、それはうまくいかなかった。

答えて

1

可能であればulimitを増やしてください。これを解決してください。

各ノードで使用されるレデューサーまたはコアの数を減らしてください。しかし、それはあなたの仕事にある程度のパフォーマンスの影響を与えます。一般的に

、お使いのクラスタがある場合:

assigned cores = `n`; 

をし、あなたが仕事を実行します。その後、並列にn * kファイルを開き、書き込みを開始しますスパーク

reducers = `k` 

デフォルトのulimitは:1024です。これは大規模アプリケーションでは低すぎます。

ulimit -aを使用すると、現在開いているファイルの最大数を確認できます。

一時的に開いているファイルの数を変更できます。システム構成ファイルを更新します。

同じのため、これらのファイルを参照してください。

/etc/sysctl.conf 
/etc/security/limits.conf 
関連する問題