【问题标题】:Order of messages with Spark ExecutorsSpark 执行器的消息顺序
【发布时间】:2017-09-19 02:26:53
【问题描述】:

我有一个 spark 流应用程序,它从 kafka 流式传输数据。我非常依赖消息的顺序,因此只在 kafka 主题中创建了一个分区。

我正在以集群模式部署此作业。

我的问题是:由于我是在集群模式下执行此操作,因此我可以让多个执行器接收任务,并且在这种情况下我会丢失从 kafka 接收到的消息的顺序。如果没有,spark如何保证订单?

【问题讨论】:

  • 您必须自己编写才能实现排序。你有任何时间戳作为消息的一部分吗?

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


【解决方案1】:

单个分区不具备分布式处理能力,因此请改用多个分区,我建议在每条消息(计数器或时间戳)中附加序列号。
如果消息中没有时间戳,那么 kafka 流提供了一种提取消息时间戳的方法,您可以使用它根据时间戳对事件进行排序,然后根据序列运行事件。

参考how to extract timestamp from kafka message.的答案

【讨论】:

    【解决方案2】:

    使用单个分区来维护秩序是正确的选择,您可以尝试以下其他一些方法:

    1. 关闭推测执行

    spark.speculation - 如果设置为“true”,则执行推测执行 的任务。这意味着如果一个或多个任务在一个 阶段,它们将重新启动。

    1. 调整您的批处理间隔/大小,以便它们可以在没有任何延迟的情况下完成处理。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2017-01-26
      • 2015-10-09
      • 2017-09-09
      • 2021-07-14
      相关资源
      最近更新 更多