卡夫卡主题分区火花流
我有一些用例,我想更加澄清,关于卡夫卡主题分区 - >火花流资源利用率。卡夫卡主题分区火花流
我使用spark独立模式,所以只有设置是“执行者总数”和“执行者内存”。据我所知,根据文档,将并行性引入Spark流的方式是使用分区的Kafka主题 - >当我使用spark-kafka直接流集成时,RDD将具有与kafka相同数量的分区。
因此,如果我在主题中有1个分区,并且有1个执行程序核心,那么这个核心将依次从卡夫卡读取。
,如果我有什么影响:
2分区的话题,只有1执行人核心是什么?这个核心是从一个分区开始,然后是从第二个分区开始读取的,所以在分割这个主题时没有任何好处?
主题中的2个分区和2个内核?然后1执行器核心从1分区读取,第二个核心从第二个分区读取?
1个kafka分区和2个executor核心?
谢谢。
基本规则是你可以缩放高达卡夫卡分区的数量。如果您将spark.executor.cores
设置为大于分区数,则某些线程将空闲。如果它小于分区数量,则Spark将从一个分区读取线程,然后从另一个分区读取线程。所以:
2个分区,1个执行程序:从一个分区读然后是其他分区。 (我不知道星火如何决定多少切换之前,从每个读取)
2P,2C:并行执行
1P,2C:一个线程空闲
对于情况#1,请注意,拥有比执行者更多的分区是可以的,因为它允许您稍后扩展而无需重新分区。诀窍是确保你的分区可以被执行者的数量整除。在将数据传递到流水线中的下一个步骤之前,Spark必须处理全部分区。所以,如果你有'剩余'分区,这可能会减慢处理速度。例如,5个分区和4个线程=>处理需要2个分区的时间 - 一次4个,然后一个线程自己运行第5个分区。
另请注意,如果通过明确设置功能中的数据分区数(如reduceByKey()
),在整个流水线中保持分区/ RDD的数量相同,还可以看到更好的处理吞吐量。
此外,我建议你看看这个项目:https://github.com/dibbhatt/kafka-spark-consumer,它实现了一个更好的工作 - 分区分区分布。 – Vale