【问题标题】:Strange delays in spark streaming火花流的奇怪延迟
【发布时间】:2017-06-02 21:42:33
【问题描述】:

我最近一直在使用 Spark Streaming 来处理 kafka 中的数据。

应用程序启动并完成几批后,有一个持续的延迟。

大多数情况下,数据处理在 1-5 秒内完成。

但是,经过几个batch之后,连续耗时41~45秒,大部分延迟发生在从stage0取数据的区域。

无意中发现 Kafka request.timemout.ms 设置默认为 40 秒,并将此设置更改为 10 秒。

然后我重新启动应用程序并观察到批处理在 11 到 15 秒内完成。

实际处理时间为 1-5 秒。我无法理解这种延迟。

怎么了?

我的环境如下。

Spark 流式传输 2.1.0(createDirectStream)

卡夫卡:0.10.1

批处理间隔:20s

Request.timeout.ms : 10s

/////

下图是 request.timeout.ms 设置为 8 秒时的图表。

【问题讨论】:

  • 您必须提供更多详细信息。向我们展示您的 Spark 图表是什么样子,或许还可以添加一张 Streaming API 是什么样子的图片,特别是深入了解需要很长时间的批次。
  • 嗨,kim,你解决了这个问题吗?我也面临同样的问题。

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


【解决方案1】:

我们也面临同样的问题,经过大量分析,我们发现这是由于KAFKA-4303中描述的kafka bug。

对于 spark 应用,我们可以通过在消费者配置中设置reconnect.backoff.ms = 0 来避免这个问题。

我有时间可能会描述更多细节。

【讨论】:

    【解决方案2】:

    我找到了问题和解决方法:

    基本上,当您从执行程序中读取 kafka 的每个分区时,用于提高性能或读取和处理的 Spark Streaming 会将读取的分区内容缓存到内存中。

    如果主题太大,缓存可能会溢出,当kafka connect fetch到kafka时,缓存已满并超时。

    解决方案:如果您使用的是 spark 2.2.0 或更高版本(来自 spark 文档),这是解决方案,是 spark 和 cloudera 已知的错误:

    消费者的缓存默认最大大小为 64。如果您希望处理的 Kafka 分区数超过(64 * 个执行程序),您可以通过 spark.streaming.kafka.consumer.cache.maxCapacity 更改此设置.

    如果您想禁用 Kafka 消费者的缓存,可以将 spark.streaming.kafka.consumer.cache.enabled 设置为 false。可能需要禁用缓存来解决 SPARK-19185 中描述的问题。一旦解决了 SPARK-19185,此属性可能会在更高版本的 Spark 中删除。

    缓存由 topicpartition 和 group.id 键控,因此每次调用 createDirectStream 时使用单独的 group.id。

    spark.streaming.kafka.consumer.cache.enabled 为 false 在您的 spark-submit 作为参数中,您的 mini-bacth 性能将像超音速飞机一样。

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 2020-07-18
      • 2019-01-07
      • 2022-08-19
      • 2021-10-16
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2014-07-31
      相关资源
      最近更新 更多