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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    1. 在 kafka 直接流中,接收器不会作为长时间运行的任务运行。在每个批次间隔开始时,首先从 executors 中的 kafka 读取数据。读取后,处理部分将接管。
    2. 如果我们创建一个包含多个主题的流,主题会一个接一个地被读取。此外,过滤 dstream 以应用不同的处理逻辑将为作业添加另一个步骤
    3. 创建多个流有两种帮助: 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/内存。

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 1970-01-01
      • 2021-06-11
      • 2023-03-25
      • 2016-10-27
      • 1970-01-01
      • 2017-10-19
      • 2019-10-26
      • 1970-01-01
      相关资源
      最近更新 更多