Spark如何处理火花流工作的异常?

时间:2017-03-30 15:14:53

标签: scala apache-spark mesos marathon

这个问题可能看起来很大,但是我有两个特定的情况,这些情况比单独的更好。首先,我正在使用spark-streaming-kafka API将Kafka的数据读入dstream。假设我有以下两种情况之一:

// something goes wrong on the driver
dstream.transform { rdd =>
  throw new Exception
}

// something goes wrong on the executors
dstream.transform { rdd =>
  rdd.foreachPartition { partition =>
    throw new Exception
  }
}

这通常描述了我可能需要停止应用程序的一些情况 - 在驱动程序或其中一个执行程序上抛出异常(例如,无法访问对处理至关重要的某些外部服务)。如果您在本地尝试此操作,则应用程序会立即失败。多一点代码:

dstream.foreachRDD { rdd =>
  // write rdd data to some output
  // update the kafka offsets
}

这是我的应用程序中发生的最后一件事 - 将数据推送到Kafka,然后确保在Kafka中移动偏移以避免重新处理。

其他说明:

  • 我在使用Marathon
  • 的Mesos上运行Spark 2.0.1
  • 检查点和预先写入日志已禁用

我希望应用程序在发生异常时关闭(就像我在本地运行它一样),因为我需要一个快速失败的行为。现在有时发生的事情是,在发生异常后,应用程序仍然显示为在Marathon中运行;更糟糕的是,在某些情况下仍然可以访问Spark UI,但不再处理任何内容。

这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

您的示例仅显示转换。仅使用Spark actions 会抛出异常,因为它们会懒惰地执行转换。我猜想任何在某处写出结果的尝试都会最终失败。