我正在运行一个从Kafka读取数据的Spark Streaming应用程序。 我已经激活了检查点,以便在发生故障时恢复工作。
问题是如果应用程序失败,当它重新启动时,它会尝试仅在一个微批次中执行故障点的所有数据。 这意味着如果微批通常从Kafka接收10.000个事件,如果它失败并且在10分钟后重新启动它将需要处理一批100,000个事件。
现在,如果我希望恢复检查点成功,我必须分配比我通常做的更多的内存。
在重新启动时,Spark Streaming是否尝试立即执行检查点中的所有过去事件或者我做错了什么,这是正常的吗?
非常感谢。
答案 0 :(得分:1)
如果您的应用程序发现在从失败中恢复后很难处理一个微批处理中的所有事件,您可以在spark-defaults.conf或应用程序内部提供spark.streaming.kafka.maxRatePerPartition
配置为spark-conf。 / p>
即如果您认为您的系统/应用程序可以安全地每秒秒处理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")
更新:出现错误,配置是每秒秒数而不是每分钟。