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

标签 scala hadoop apache-spark

当读取存储在 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")

如果文件缺少 block ,此程序将失败而不是生成所需的计数 0。这是我收到的异常

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost): org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: ...

我知道 spark 可能会乱序运行,因此异常处理最好放在 RDD.map 中(例如 Apache spark scala Exception handling ),但如果 R​​DD 尚未创建怎么办?

最佳答案

因为当您调用 sc.textFile("hdfs:///path/to/fileWithMissingBlock") 时,spark 不会执行任何操作(延迟评估),即:从您的文件系统读取文件。

它实际上是在调用action 时执行的,这里是count 方法。那一刻异常进来了。

关于scala - 使用 Spark sc.textFile 读取文件时如何捕获 BlockMissingException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47211219/

相关文章:

scala - Spark结构化流处理中跳过批处理

scala - 如何关闭多项目构建的并行测试执行?

java - 导航到名称相似的Java/Scala软件包

scala - 使用响应式(Reactive) mongo 驱动程序时,控制台 Scala 应用程序不会停止

hadoop - Hbase Hadoop 集成问题

apache-spark - 如何同时刷新表?

hadoop - 输入格式决定

hadoop - 无法启动 Nutch 爬行

java - Spark 读取 csv - Java 中的多个 S3 路径

hadoop - 为 spark 输出文件设置 S3 输出文件受赠者