我正在从kafka传输数据并尝试将每批事件的数量限制为10个事件。处理10-15批后,批量大小突然飙升。以下是我的设置:
int main{
A a(10);
B b();
a += b;
}
答案 0 :(得分:1)
这是火花中的错误,请访问:https://issues.apache.org/jira/browse/SPARK-18371
拉取请求尚未合并,但您可以自行选择并构建火花。
总结一下这个问题:
如果您将spark.streaming.backpressure.pid.minRate
设置为数字< =分区计数,则计算有效率为0:
val totalLag = lagPerPartition.values.sum
...
val backpressureRate = Math.round(lag / totalLag.toFloat * rate)
...
(第二行计算每个分区的速率,其中rate
是从PID传入的速率,默认为minRate,当PID计算它应该更小时)
如上:DirectKafkaInputDStream code
这导致0导致回退到(不合理的)分区头部:
...
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
}
...
maxMessagesPerPartition(offsets).map { mmp =>
mmp.map { case (tp, messages) =>
val lo = leaderOffsets(tp)
tp -> lo.copy(offset = Math.min(currentOffsets(tp) + messages, lo.offset))
}
}.getOrElse(leaderOffsets)
与DirectKafkaInputDStream#clamp
一样当您的实际和最小接收速率/消息/分区较小时,背压基本上不起作用〜等于分区计数并且您遇到显着滞后(例如,消息进入峰值并且您具有恒定的处理能力)。