Spark:并行处理多个kafka主题

问题描述 投票:0回答:3

我正在使用

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

  1. 在同一份工作中执行此操作是个好主意吗?如果是这样,我应该为每个主题创建具有多个分区的单个流还是不同的流?
  2. 我使用的是Kafka direct steam。据我所知,spark 为每个分区启动长时间运行的接收器。我有一个相对较小的集群,有 6 个节点,每个节点有 4 个核心。如果我有很多主题,并且每个主题中有多个分区,那么效率是否会受到影响,因为大多数执行器都忙于长时间运行的接收器? 如果我的理解有误请指正
apache-spark apache-kafka spark-streaming
3个回答
21
投票

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

  1. 在kafka直接流中,接收器不作为长时间运行的任务运行。在每个批次间隔开始时,首先从执行器中的 kafka 读取数据。一旦读取,处理部分就会接管。
  2. 如果我们创建一个包含多个主题的流,这些主题将被一个接一个地读取。此外,过滤 dstream 以应用不同的处理逻辑会给工作增加另一个步骤
  3. 创建多个流有两个好处: 1. 您不需要应用过滤操作来以不同的方式处理不同的主题。 2. 您可以并行读取多个流(而不是在单个流的情况下逐一读取)。为此,有一个未记录的配置参数

    spark.streaming.concurrentJobs*
    。所以,我决定创建多个流。

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

7
投票

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

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

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

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


0
投票

Spark 结构化流似乎正在解决这个问题。我稍后会分享示例代码。同时可以浏览this答案

© www.soinside.com 2019 - 2024. All rights reserved.