【发布时间】:2017-08-24 14:44:28
【问题描述】:
这个问题看起来可能相当大,但是我有两种具体情况,最好放在一起而不是分开。首先,我使用 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,尽管不再处理任何内容。
这可能是什么原因?
【问题讨论】:
标签: scala apache-spark mesos marathon