在我的项目中,我在RDD的动作和转换中执行一些副作用。我想测试我的业务逻辑是否有效,即使Spark引擎必须重试某些分区的计算。 所以我试图在计算过程中模拟失败。
object Test extends App {
val conf = new SparkConf()
conf.setMaster("local[4]")
conf.setAppName(getClass.getName)
val sc = new SparkContext(conf)
try {
val data = sc.parallelize(1 to 10)
val res = data.map(n => {
if (TaskContext.get().attemptNumber() == 0 && n==5) {
sys.error("boom!")
}
n * 2
}).collect()
}
finally {
sc.stop()
}
}
但它不起作用:异常传播给驱动程序。 似乎Spark尝试仅故障转移其内部错误。 有没有办法测试它?
答案 0 :(得分:0)
我想说你可能会在你的程序中出错,并且能够通过spark来理解容错计算机制。
首先,请参考scala doc,特别是此功能:
for item in driver.find_elements_by_css_selector("u.StretchedBox+span"):
print(item.text)
使用提供的消息抛出一个新的RuntimeException。
如果您在程序中插入此代码,并且没有catch异常语句,则调用此函数将导致运行时异常并使当前进程终止。
这与spark的容错计算机制无关,这只与流程及其运行的操作系统有关!没有catch的运行时异常将导致控制流(aka.current进程)终止。
但是,spark的容错计算机制是什么?
它是关于内部的火花,它使用多重复制来保证计算安全,一个特定的火花应用程序的每个任务都可能崩溃,有很多可能的原因,如网络故障。
但是通过使用一个聪明的技巧,驱动程序节点维持rdds依赖的谱系。 然后可以使用驱动节点的谱系从原始数据集重新计算任何分区(aka.task)。
关于应用程序(spark)级别,而不是os +进程级别。