使用Spark sc.textFile读取文件时如何捕获BlockMissingException?

时间:2017-11-09 20:44:52

标签: scala hadoop apache-spark

当读取存储在HDFS上的文本文件时,如果我在使用sc.textFile读取这些文件时遇到BlockMissingException(或其他一些异常),我如何捕获错误并继续使用emptyRDD?

我可能遇到BlockMissingException的原因是,例如,文件存储在HDFS上,复制因子为1,数据节点出现故障。

考虑以下最低示例代码:

    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。这是我收到的例外

  

线程“main”中的异常org.apache.spark.SparkException:Job   由于阶段失败而中止:阶段0.0中的任务0失败1次,大多数   最近的失败:阶段0.0中失去的任务0.0(TID 0,localhost):   org.apache.hadoop.hdfs.BlockMissingException:无法获取块:   ...

我知道spark可能会乱序运行,因此异常处理可能更好地位于RDD.map中(例如Apache spark scala Exception handling),但是如果还没有创建RDD怎么办?

1 个答案:

答案 0 :(得分:1)

因为当你致电sc.textFile("hdfs:///path/to/fileWithMissingBlock")时,spark不会做任何事情(延迟评估),即:从你的文件系统中读取文件。

它实际上是在调用action时执行的,这里是count方法。那个诅咒的例子就出现了。