2017-10-19 9 views
2

複数のデータポイントセットを処理するSparkアプリケーションを実行しています。これらのセットのいくつかは順次処理する必要があります。データポイントの小さなセット(約100)に対してアプリケーションを実行すると、すべて正常に動作します。しかし、いくつかのケースでは、セットはcaのサイズを持つでしょう。万個のデータポイント、およびそれらの労働者は、次のスタックトレースでクラッシュする原因:スパークワーカーがスローFileNotFoundException一時シャッフルファイルの場合

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 26.0 failed 4 times, most recent failure: Lost task 0.3 in stage 26.0 (TID 36, 10.40.98.10, executor 1): java.io.FileNotFoundException: /tmp/spark-5198d746-6501-4c4d-bb1c-82479d5fd48f/executor-a1d76cc1-a3eb-4147-b73b-29742cfd652d/blockmgr-d2c5371b-1860-4d8b-89ce-0b60a79fa394/3a/temp_shuffle_94d136c9-4dc4-439e-90bc-58b18742011c (No such file or directory) 
    at java.io.FileOutputStream.open0(Native Method) 
    at java.io.FileOutputStream.open(FileOutputStream.java:270) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213) 
    at org.apache.spark.storage.DiskBlockObjectWriter.initialize(DiskBlockObjectWriter.scala:102) 
    at org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:115) 
    at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:235) 
    at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:151) 
    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:108) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:335) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
    at java.lang.Thread.run(Thread.java:748) 

私は、このエラーの複数のインスタンスの後にすべてのログファイルをチェックしているが、任意の他のエラーメッセージを見つけられませんでした。スパーク・プロセスを実行しているユーザーが/tmp/に読み取り/書き込み権限がありません

  • :この問題のためにインターネットを検索

    、私は私の状況に適用できるように思わない2つの潜在的な原因を発見しましたディレクトリ。

    • このエラーは大きなデータセット(常にではなく)でのみ発生すると見られますが、これは問題ではありません。
  • /tmp/ディレクトリにシャッフルファイル(または他の一時的なSparkファイル)のための十分なスペースがありません。
    • 私のシステムの/tmp/ディレクトリには約45GBの空き容量があり、1つのデータポイント(< 1KB)のデータ量はこれもそうでない可能性があります。

私は回避策と考えられる原因を見つけようと、時間のカップルのために、この問題で暴れるされています。

  • は、私は、これはシャッフルの必要性を排除するため、このエラーを回避することを期待して、ドライバと同じマシン上で実行して、単一のワーカーに(通常は二つのマシンである)クラスタを削減しようとしています。これはうまくいかなかった。エラーはまったく同じ方法で発生します。
  • 私は、テール再帰的メソッドを介してデータセットを順次処理する操作に問題を切り分けました。

この問題の原因は何ですか?原因を自分で判断するにはどうすればいいですか?

答えて

2

問題は、ワーカーで発生するスタックオーバーフロー(ha!)と判明しています。

慌てて、私はドライバに完全に実行される操作を書き換えました(実際にはSparkの機能を無効にしています)。このコードを実行すると、システムはまだクラッシュしましたが、今度はStackOverflowErrorと表示されます。私が以前信じていたのとは逆に、tail-recursiveメソッドは他のどのような再帰と同じようにスタックオーバーフローを引き起こす可能性があります。再帰を使わないようにメソッドを書き直した後、問題は消えました。

元のFileNotFoundExceptionを生成する可能性があるのはスタックオーバーフローだけではありませんが、実際の問題の原因を特定するには、操作をドライバにプルする一時的なコード変更を行うのが良い方法です。

関連する問題