首页 文章

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

提问于
浏览
1

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

我可能遇到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的计数 . 这是我收到的例外

线程“main”中的异常org.apache.spark.SparkException:作业因阶段失败而中止:阶段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 回答

  • 1

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

    它实际上是在调用 action 时执行的,这里是 count 方法 . 那个monment例子进来了 .

相关问题