2017-11-09 16 views
1

HDFSに保存されたテキストファイルを読み込むときに、sc.textFileでこれらのファイルを読み込んでいるときにBlockMissingException(またはその他の例外)が発生した場合、エラーをキャッチしてemptyRDDを続行するにはどうすればよいですか?Spark sc.textFileを使用してファイルを読み取っているときに、どのようにBlockMissingExceptionを捕まえることができますか?

私がBlockMissingExceptionに遭遇する理由は、たとえば、ファイルが1の複製係数でHDFSに保存され、データノードがダウンした場合です。

は、次の最小のコード例を検討:

val myRDD: RDD[String] = 
     try { 
      sc.textFile("hdfs:///path/to/fileWithMissingBlock") 
     } catch { 
      case e: BlockMissingException => 
       println("missing block, continuing with empty RDD") 
       sc.emptyRDD[String] 
      case e: Throwable => 
       println("unknown exception, continuting with empty RDD") 
       sc.emptyRDD[String] 
     } 

    val nLines = myRDD.count 
    println("There are " + nLines + " lines") 

このプログラムは、ファイルが存在しないブロックを有する場合には、代わりに0のカウントを生成する失敗します。ここでは、「メイン」org.apache.spark.SparkExceptionは、私がスレッドで

例外を受け取る例外です:原因ステージ障害のために中止されまし仕事 :タスク0 0.0は、1回失敗した段階で、最も 最近の失敗:失われたタスク段階0.0 0.0(TID 0、ローカルホスト): org.apache.hadoop.hdfs.BlockMissingException:ブロックを取得できませんでした: ...

私はその火花が例外処理ので、順不同で物事を実行することが理解RDD.map(例えばApache spark scala Exception handling)の中にある方が良いかもしれませんが、RDDがまだ作成されていない場合はどうなりますか?

答えて

1

sc.textFile("hdfs:///path/to/fileWithMissingBlock")を呼び出すと、sparkは何もしません(遅延評価)。つまり、ファイルシステムからファイルを読み込みます。

actionが呼び出されたときに実際に実行されますが、ここではcountメソッドです。その慰謝料の例外は入ってくる。

関連する問題