如何避免Spark流中批量大小突然激增?

时间:2017-11-17 14:42:06

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

我正在从kafka传输数据并尝试将每批事件的数量限制为10个事件。处理10-15批后,批量大小突然飙升。以下是我的设置:

int main{
    A a(10);
    B b();
    a += b;
}

Please check this image for the streaming behavior

1 个答案:

答案 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

一样

当您的实际和最小接收速率/消息/分区较小时,背压基本上不起作用〜等于分区计数并且您遇到显着滞后(例如,消息进入峰值并且您具有恒定的处理能力)。