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