【问题标题】:FIFO processing using Spark Streaming?使用 Spark Streaming 进行 FIFO 处理?
【发布时间】:2017-07-03 10:01:06
【问题描述】:

我有一个用例,我必须以 FIFO 方式处理事件。这些是从机器生成的事件。每台机器每 30 秒生成一个事件。对于特定的机器,我们需要根据先进先出的方式处理事件。

我们每天需要处理大约 2.4 亿个事件。对于如此大规模,我们需要使用 Kafka+Spark Streaming

从 Kafka 文档中我了解到,我们可以使用消息的关键字段将消息路由到特定主题分区。这确保了我可以使用机器 ID 作为键,并确保来自特定机器的所有消息都进入同一个主题分区。

50% 的问题已解决。

这里是处理端的问题。

Kafka Direct 方法的 spark 文档说 RDD 分区等同于 Kafka 分区。

那么当我执行 rdd.foreachPartition 时,任务是否以有序方式迭代?

是否保证RDD的一个partition总是在一个executor中?

是否保证foreachPartition任务只由一个线程执行整个分区?

请帮忙。

【问题讨论】:

    标签: apache-spark spark-streaming


    【解决方案1】:

    从 Kafka 文档中,我了解到我们可以使用消息的关键字段将消息路由到特定的主题分区。这确保了我可以使用机器 ID 作为键,并确保来自特定机器的所有消息都进入同一个主题分区。

    在向 Kafka 发布数据时,您不需要使用机器 ID。使用 null 作为 key,kafka 将在内部使用 Hash 分区方案将数据适当地发送到不同的 kafka 主机。

    这是处理端的问题。

    问题:当您在 spark 中处理时,它不会有全局顺序。示例:有 5 个事件(按时间排序):e0(最早)、e1、e2、e3、e4(最新)

    这些被路由到不同的 kafka 分区:

    Kakfa Partition P0: e0, e3 Kafka Partition P1: e1, e2, e4

    因此,当您阅读 spark 作业时,您将在一个 RDD 中获得 e0, e3,在另一个 RDD 中获得 e1, e2, e4,按此顺序。

    如果你想要全局排序,(e0, e1, e2, e3, e4),你需要在 kafka 中写入单个分区。但是随后您将失去分区容错性并遇到一些性能问题(需要调整生产者和消费者)。 3000 个事件/秒应该没问题,但这也取决于您的 kafka 集群。

    @zsxwing (see) 已经回答了您的其他问题

    【讨论】:

      【解决方案2】:

      假设您不使用任何重新分区数据的运算符(例如,repartitionreduceByKeyreduceByKeyAndWindow,...)。

      那么当我执行 rdd.foreachPartition 时,任务是否以有序方式迭代?

      是的。它按照Kafka分区中的顺序处理数据。

      是否保证RDD的一个partition总是在一个executor中?

      是的。如果您不启用speculation,则只有一个执行程序(任务)处理分区。 speculation 如果太慢,可能会启动另一个任务来运行同一分区。

      是否保证foreachPartition任务只由一个线程执行整个分区?

      是的。对一个分区中的数据一一进行处理。

      【讨论】:

      • 这个答案的第一句话很重要。任何导致随机播放的操作都会导致您的数据“不同步”。如果这是一个问题,请考虑根据机器 ID 对事件进行显式排序。
      猜你喜欢
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2016-10-31
      • 2019-06-25
      • 2021-11-19
      • 2017-02-06
      相关资源
      最近更新 更多