Kafka 主题分区到 Spark 流

Kafka topic partitions to Spark streaming

关于 Kafka 主题分区 -> Spark 流资源利用,我有一些用例想进一步说明。

我使用 spark 独立模式,所以我只有 "total number of executors" 和 "executor memory" 的设置。据我所知,根据文档,将并行性引入 Spark 流的方法是使用分区的 Kafka 主题 -> 当我使用 spark-kafka 直接流集成时,RDD 将具有与 kafka 相同数量的分区。

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

如果我有会怎样:

谢谢。

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

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

  2. 2p、2c:并行执行

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

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

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