Kafka主题分区为Spark流媒体

Srd*_*vic 12 apache-kafka apache-spark spark-streaming

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

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

因此,如果我在主题中有1个分区,并且有1个执行程序核心,那么该核心将从Kafka顺序读取.

如果我有:

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

  • 主题中有2个分区和2个核心?然后1个执行器核心从1个分区读取,第二个核心从第二个分区读取吗?

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

谢谢.

Ang*_*own 18

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

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

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

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

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

另请注意,如果通过在函数中明确设置数据分区的数量来保持整个管道中的分区/ RDD数量相同,您也可以看到更好的处理吞吐量reduceByKey().