当读取存储在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怎么办?
答案 0 :(得分:1)
因为当你致电sc.textFile("hdfs:///path/to/fileWithMissingBlock")
时,spark不会做任何事情(延迟评估),即:从你的文件系统中读取文件。
它实际上是在调用action
时执行的,这里是count
方法。那个诅咒的例子就出现了。