Spark:并行处理多个kafka主题

Posted

技术标签:

【中文标题】Spark:并行处理多个kafka主题【英文标题】:Spark: processing multiple kafka topic in parallel 【发布时间】:2016-03-29 14:10:51 【问题描述】:

我正在使用spark 1.5.2。我需要使用 kafka 作为流媒体源来运行 spark 流媒体作业。我需要阅读 kafka 中的多个主题并以不同方式处理每个主题。

    在同一份工作中这样做是个好主意吗?如果是这样,我应该为每个主题创建一个包含多个分区的流还是不同的流? 我正在使用 Kafka 直接蒸汽。据我所知,spark 会为每个分区启动长时间运行的接收器。我有一个相对较小的集群,6 个节点,每个节点有 4 个核心。如果我在每个主题中有很多主题和分区,效率会因为大多数执行者忙于长时间运行的接收者而受到影响吗? 如果我的理解有误请指正

【问题讨论】:

【参考方案1】:

我做了以下观察,以防它对某人有帮助:

    在 kafka 直接流中,接收器不会作为长时间运行的任务运行。在每个批次间隔开始时,首先从 executors 中的 kafka 读取数据。读取后,处理部分将接管。 如果我们创建一个包含多个主题的流,主题会一个接一个地被读取。此外,过滤 dstream 以应用不同的处理逻辑将为作业添加另一个步骤

    创建多个流有两种帮助: 1. 您无需应用过滤器操作来以不同的方式处理不同的主题。 2.您可以并行读取多个流(而不是在单个流的情况下一个接一个)。为此,有一个未记录的配置参数spark.streaming.concurrentJobs*。所以,我决定创建多个流。

    sparkConf.set("spark.streaming.concurrentJobs", "4");
    

【讨论】:

@CodyKoeninger,在我们知道容器中的所有元素都来自同一个主题之前,我们需要下降到哪个级别?即,在 RDD 中,我是否保证所有记录都来自同一主题?还是在分区级别?在这种情况下,是否有公开它的高级 API? @Stephane 在进行转换之前,直接流的 RDD 分区与 kafka topicpartitions 是 1:1 的。见github.com/koeninger/kafka-exactly-once @prasad-khode - 我可以在其中找到与“如果我们创建一个包含多个主题的单个流,主题一个接一个地阅读”的相关性,看起来它没有记录在 kafka 中火花流。 @ASe 没有文档,但这是我通过在标准输出上打印消息所观察到的。 你是如何启动多个流的?【参考方案2】:

我认为正确的解决方案取决于您的用例。

如果您对来自所有主题的数据的处理逻辑相同,那么毫无疑问,这是一种更好的方法。

如果处理逻辑不同,我猜你会从所有主题中获得一个 RDD,你必须为每个处理逻辑创建一个 pairrdd 并单独处理它。问题是这会产生一种分组处理,整体处理速度将取决于需要最长处理时间的主题。因此,数据较少的主题必须等到所有主题的数据都处理完毕。一个优点是,如果它是一个时间序列数据,那么处理会一起进行,这可能是一件好事。

运行独立作业的另一个优势是您可以更好地控制并调整资源共享。例如:处理具有高吞吐量主题的作业可以分配更高的 CPU/内存。

【讨论】:

以上是关于Spark:并行处理多个kafka主题的主要内容,如果未能解决你的问题,请参考以下文章

Spark Direct Stream 不会为每个 kafka 分区创建并行流

Spark Streaming:微批处理并行执行

具有多个接收器的 pyspark 并行处理

具有动态数量的并行消费者的 Kafka 工作队列

Kafka消费者可以并行处理多条消息吗

Kafka如何并行消费一个主题