为createDirectStream设置spark.streaming.kafka.maxRatePerPartition

时间:2016-12-07 16:20:42

标签: apache-spark spark-streaming

我需要为我的应用程序增加每个分区的输入速率,并且我已使用.set("spark.streaming.kafka.maxRatePerPartition",100)进行配置。流持续时间为10秒,因此我希望此批处理过程5*100*10=5000。但是,我收到的输入费率只有500左右。您能否建议进行任何修改以提高此费率?

2 个答案:

答案 0 :(得分:9)

  

流的持续时间是10秒,所以我希望进程5 * 100 * 10 = 5000条消息   这个批次。

这不是设置的含义。这意味着"每个分区可以有多少元素每批" ,而不是每秒。我假设您有5个分区,因此您获得5 * 100 = 500.如果您想要5000,请将maxRatePerPartition设置为1000。

来自"Exactly-once Spark Streaming From Apache Kafka"(由Cody编写,直接流方法的作者,强调我的):

  

对于速率限制,您可以使用Spark配置变量   spark.streaming.kafka.maxRatePerPartition设置最大数量   消息每批次每个分区

编辑:

在@avrs评论之后,I looked inside the code which defines the max rate。事实证明,启发式比博客文章和文档中的说法要复杂得多。

有两个分支。如果在maxRate旁边启用背压,则maxRate是由RateEstimator对象计算的当前背压率与用户设置的maxRate之间的最小值。如果未启用,则将maxRate定义为原样。

现在,在选择费率后,总是乘以总批次数,实际上是每秒的费率:

if (effectiveRateLimitPerPartition.values.sum > 0) {
  val secsPerBatch = context.graph.batchDuration.milliseconds.toDouble / 1000
  Some(effectiveRateLimitPerPartition.map {
    case (tp, limit) => tp -> (secsPerBatch * limit).toLong
  })
} else {
  None
}

答案 1 :(得分:0)

属性每秒从分区中获取N条消息。如果我有M个分区,并且批处理间隔为B,那么我可以批量查看的消息总数为N * M * B。

您应该验证的几件事

  1. 您的输入速率是> 500还是10秒钟。
  2. kafka主题是否已正确分区。