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 分区之间的映射