1

我正在运行一个从 Kafka 读取数据的 Spark Streaming 应用程序。我已激活检查点以在发生故障时恢复作业。

问题是,如果应用程序失败,当它重新启动时,它会尝试仅在一个微批次中执行故障点的所有数据。 这意味着,如果一个微批处理通常从 Kafka 接收 10.000 个事件,如果它失败并在 10 分钟后重新启动,它将不得不处理一个包含 100.000 个事件的微批处理。

现在,如果我希望通过检查点恢复成功,我必须分配比正常情况更多的内存。

重新启动时,Spark Streaming 尝试从检查点一次执行所有过去的事件是否正常,还是我做错了什么?

非常感谢。

4

1 回答 1

1

如果您的应用程序在从故障中恢复后发现难以在一个微批次中处理所有事件,您可以spark.streaming.kafka.maxRatePerPartition在 spark-defaults.conf 或应用程序内部提供配置是 spark-conf。

即,如果您认为您的系统/应用程序可以安全地每分钟每秒处理 10K 事件,并且您的 kafka 主题有 2 个分区,请将此行添加到 spark-defaults.conf

spark.streaming.kafka.maxRatePerPartition 5000

或将其添加到您的代码中:

val conf = new SparkConf()
conf.set("spark.streaming.kafka.maxRatePerPartition", "5000")

此外,我建议您将此数字设置得稍高一些并启用背压。这将尝试以不会破坏您的流媒体应用程序的速率流式传输数据。

conf.set("spark.streaming.backpressure.enabled","true")

更新:出现错误,配置是每秒秒数而不是每分钟。

于 2016-06-22T14:04:25.660 回答