我有火花串流应用程序,它使用Spark Direct Streaming(非接收器)方法从Kafka读取消息,并为每个分区处理消息。
在我的Kafka分区中,有时我们得到的消息需要20秒来处理2000条消息,而有些消息需要7-9秒才能获得相同的消息。消息。
鉴于波动,我们按如下方式打开背压设置。
spark.batch.duration=10 seconds
spark.streaming.kafka.maxRatePerPartition=200
spark.streaming.backpressure.enabled=true
spark.streaming.backpressure.initialRate=60
spark.streaming.kafka.maxRatePerPartition=200
并使用以下参数指定 RateEstimator 。 我不了解PID的数学,但尝试了不同的组合,其中之一如下。
spark.streaming.backpressure.rateEstimator=pid
spark.streaming.backpressure.pid.minRate=1600
spark.streaming.backpressure.pid.integral=1
spark.streaming.backpressure.pid.proportional=25
spark.streaming.backpressure.pid.derived=1
最初,spark在RDD中读取1个分区的2000条消息,但一段时间后它开始读取800条记录。我认为是minRate / 2。然后它保持静止.. 在日志中,它始终以新的速率打印1600.
2017-01-20 14:55:14 TRACE PIDRateEstimator:67 - New rate = 1600.0
鉴于我的情况,我几乎没有问题:
答案 0 :(得分:0)
回答您的问题 #1 -
spark.streaming.backpressure.pid.minRate
是每个分区每秒的消息数。
关于您的消息消耗率的差异,可能是由于pid配置错误。
在大多数情况下,pid.proportional
、pid.integral
和 pid.derived
的默认值就足够了。因此,如果任何人对 pid 速率估计器背后的数学没有正确理解,建议继续使用默认值。我要调整的唯一参数是 spark.streaming.backpressure.pid.minRate
见:https://richardstartin.github.io/posts/tuning-spark-back-pressure-by-simulation https://www.linkedin.com/pulse/enable-back-pressure-make-your-spark-streaming-production-lan-jiang/