【问题标题】:Spark Streaming: irregular input rate after Kafka restartSpark Streaming:Kafka重启后输入速率不规律
【发布时间】:2016-06-07 15:47:40
【问题描述】:

我目前正在 spark 上运行一个流式应用程序,该应用程序使用新的直接方法(无接收器)消耗一个简单的 kafka 主题。由于我们在 Kafka 集群上遇到了一些问题,即使在 Kafka 上恢复正常后,流式应用程序也遇到了一些麻烦:一些作业正在处理几乎空的 rdd,而另一些正在处理双倍大小的 rdd。平均输入率仍与以前相同,但处理时间不规律。

我尝试重新启动应用程序,但没有任何区别。我在 Kafka 和 Spark 方面都没有发现任何堆栈或线索。

有人可以告诉我如何解决此类问题吗?或者至少在哪里可以了解发生了什么?

【问题讨论】:

    标签: apache-kafka spark-streaming


    【解决方案1】:

    在 Kafka 的直接无接收器方法中,Spark Master 节点从 Kafka 的每个分区读取当前偏移量,然后告诉每个工作人员从哪个分区读取,以及从什么偏移量到什么偏移量.在Spark-Streaming Kafka Integration documentation 上有说明:

    使用directStream,Spark Streaming 将创建尽可能多的 RDD 分区 因为有 Kafka 分区要消费,它们都会读取数据 来自卡夫卡并行。所以 Kafka 之间存在一对一的映射关系 和 RDD 分区,更容易理解和调优。

    假设您有 3 个 Spark worker 和 3 个 Kafka 分区(为简单起见)。如果 Kafka 没有正确分区它的数据并且分区 1 和 3 最终接收到所有数据而分区 2 没有数据,那么您将以包含 2 个大分区的批次结束,并且每个 spark 工作人员将在其中一个上运行分区,这限制了并行的数量。

    这看起来像是 Kafka 问题,而不是 Spark 问题。我建议看看 Kafka 如何为您正在阅读的特定主题对数据进行分区。作为一种快速解决方法,您可以在使用 DStream.repartition 从 Kafka 读取数据后重新分区。

    【讨论】:

    • 仔细查看 Web UI 中多个批次的分区偏移量增量,似乎所有分区都被平均消耗。如果是 Kafka 问题,则未链接到 rdd 分区映射 :(
    • @SebastienFalquier 你能告诉我们你的 Spark DAG 吗? (您在 DStream 上使用的转换)。
    • 不幸的是,Spark DAG 不是罪魁祸首,因为我在 2 个应用程序上遇到了同样的问题,每个应用程序都使用不同的主题。
    • @Sebastien 是否可以设置一个新的 Kafka 集群进行检查?您是否尝试过显式重新分区数据
    • 当您说重新分区数据时,您的意思是使用DStream.repartition?
    【解决方案2】:

    最后,我发现了问题所在:kafka集群拓扑在ops之后发生了变化,导致用于创建直接流的broker列表不是最新的。不幸的是,spark kafka 消费者似乎无法自动发现和删除代理...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-18
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2013-03-01
      • 2011-12-05
      相关资源
      最近更新 更多