当读取存储在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 回答
因为当你调用
sc.textFile("hdfs:///path/to/fileWithMissingBlock")
时,spark不会做任何事情(延迟评估),即:从文件系统中读取文件 .它实际上是在调用
action
时执行的,这里是count
方法 . 那个monment例子进来了 .