Spark Streaming spark.streaming.backpressure.pid.minRate是每个分区还是每个批处理间隔的总消息数?

时间:2017-01-20 20:11:44

标签: apache-kafka spark-streaming cloudera-cdh

我有火花串流应用程序,它使用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

鉴于我的情况,我几乎没有问题:

  1. 每个分区spark.streaming.backpressure.pid.minRate或总数是否。要批量阅读的邮件?
  2. 为什么要阅读800条消息而不是1600条?
  3. 任何建议的参数在处理过程中降低输入速率需要很长时间并在处理速度非常快时增加回接近maxRatePerPartition的值? 在我的例子中,输入速率从2000开始,但是当它花费很长时间平均20秒时,它将其减少到800但是当在3-4秒内处理800条消息时它没有将其增加到1600或更多。这会浪费时间和低吞吐量。
  4. processing after sometime processing after streaming started

1 个答案:

答案 0 :(得分:0)

回答您的问题 #1 - spark.streaming.backpressure.pid.minRate 是每个分区每秒的消息数。

关于您的消息消耗率的差异,可能是由于pid配置错误。

在大多数情况下,pid.proportionalpid.integralpid.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/