我有一些用例想要更清楚地说明,关于 Kafka 主题分区 -> Spark 流资源利用率。
我使用spark独立模式,所以我只有“执行器总数”和“执行器内存”设置。据我所知,根据文档,将并行性引入 Spark 流的方法是使用分区 Kafka 主题 -> 当我使用 Spark-kafka 直接流集成时,RDD 将具有与 kafka 相同数量的分区。
因此,如果主题中有 1 个分区和 1 个执行器核心,该核心将按顺序从 Kafka 读取。
如果我有会发生什么:
主题中有 2 个分区,但只有 1 个执行器核心?该核心是否会先从一个分区读取,然后再从第二个分区读取,因此对主题进行分区不会有任何好处?
主题中有 2 个分区和 2 个核心?那么 1 个执行器核心会从 1 个分区读取数据,而第二个执行器核心会从第二个分区读取数据吗?
1 个 kafka 分区和 2 个执行器核心?
谢谢。
最佳答案
基本规则是您可以扩展 Kafka 分区的数量。如果将 spark.executor.cores
设置为大于分区数,则某些线程将处于空闲状态。如果它小于分区数,Spark 将使线程先从一个分区读取,然后再从另一个分区读取。所以:
2 个分区,1 个执行程序:先从一个分区读取,然后从其他分区读取。 (我不确定 Spark 如何决定在切换之前从每个读取多少内容)
2p、2c:并行执行
1p、2c:一个线程空闲
对于情况#1,请注意,分区数多于执行器数是可以的,因为它允许您稍后进行扩展而无需重新分区。诀窍是确保您的分区可以被执行器的数量整除。在将数据传递到管道中的下一步之前,Spark 必须处理所有分区。因此,如果您有“剩余”分区,这可能会减慢处理速度。例如,5 个分区和 4 个线程 => 处理需要 2 个分区的时间 - 一次 4 个分区,然后一个线程自行运行第 5 个分区。
另请注意,如果通过在 reduceByKey()
等函数中显式设置数据分区的数量来保持整个管道中分区/RDD 的数量相同,您也可能会看到更好的处理吞吐量。
关于apache-spark - Kafka 主题分区到 Spark 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37810709/