Kafka主题分区为Spark流媒体

时间:2016-06-14 11:27:58

标签: apache-spark apache-kafka spark-streaming

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

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

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

如果我有以下情况会发生什么:

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:13)

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

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

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

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

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

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