Kafka 主题分区到 Spark 流

Posted

技术标签:

【中文标题】Kafka 主题分区到 Spark 流【英文标题】:Kafka topic partitions to Spark streaming 【发布时间】:2016-10-15 02:37:04 【问题描述】:

关于 Kafka 主题分区 -> 火花流资源利用,我想更清楚一些用例。

我使用 spark 独立模式,所以我只有“执行器总数”和“执行器内存”。据我所知并根据文档,将并行性引入 Spark 流的方法是使用分区的 Kafka 主题 -> 当我使用 spark-kafka 直接流集成时,RDD 将具有与 kafka 相同数量的分区。

因此,如果我在主题中有 1 个分区和 1 个执行器核心,则该核心将按顺序从 Kafka 中读取。

如果我有会发生什么:

主题中有 2 个分区,只有 1 个执行器核心?该核心会先从一个分区读取,然后再从第二个分区读取,因此对主题进行分区没有任何好处?

主题中有 2 个分区和 2 个核心?那么 1 个执行器核心会从 1 个分区读取,而第二个核心会从第二个分区读取吗?

1 个 kafka 分区和 2 个执行器核心?

谢谢。

【问题讨论】:

【参考方案1】:

基本规则是您可以扩展到 Kafka 分区的数量。如果设置spark.executor.cores大于分区数,部分线程会处于空闲状态。如果它小于分区数,Spark 将从一个分区读取线程,然后从另一个分区读取。所以:

    2 个分区,1 个执行程序:先从一个分区读取,然后再从另一个分区读取。 (我不确定 Spark 在切换之前如何决定从每个读取多少)

    2p、2c:并行执行

    1p,2c:一个线程空闲

对于案例 #1,请注意,分区数多于执行程序数是可以的,因为它允许您以后横向扩展而无需重新分区。诀窍是确保您的分区可以被执行程序的数量整除。在将数据传递到管道中的下一步之前,Spark 必须处理所有个分区。因此,如果您有“剩余”分区,这可能会减慢处理速度。例如,5 个分区和 4 个线程 => 处理需要 2 个分区的时间 - 一次 4 个,然后一个线程自己运行第 5 个分区。

另外请注意,如果通过在 reduceByKey() 等函数中显式设置数据分区的数量来保持整个管道中的分区/RDD 数量相同,您可能还会看到更好的处理吞吐量。

【讨论】:

除此之外,我建议你看看这个项目:github.com/dibbhatt/kafka-spark-consumer,它实现了更好的 worker -topic 分区分布。 @sean-owen 请您对此发表评论以确认?我特别渴望确认 2。我不确定 3 是否正确 - 这意味着 Spark 不能给消费者超过 1 个线程。

以上是关于Kafka 主题分区到 Spark 流的主要内容,如果未能解决你的问题,请参考以下文章

解释 Spark 结构化流执行器和 Kafka 分区之间的映射

将 PubSub 流保存到 GCS 中的分区拼花文件

解释Spark Structured Streaming执行程序和Kafka分区之间的映射

Spark:并行处理多个kafka主题

spark数据倾斜

基于kafka分区的结构化流式读取