测试火花故障转移

时间:2017-08-01 08:56:54

标签: scala apache-spark testing

在我的项目中,我在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尝试仅故障转移其内部错误。 有没有办法测试它?

1 个答案:

答案 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 +进程级别。