当业务数据增长比较明显,那么Kafka吞吐量,刚开始创建的topic数目和分区数目可能满足不了并发需求,需要增加分区。新增加的分区会有生产者往里面写数据,而Spark Streaming跟Kafka 0.8版本结合的API是满足不了动态发现Kafka新增topic或者分区的需求的。
从Spark Streaming源码出发查看分区检测是在哪做的,对于批处理的Spark Streaming任务来说,分区检测应该在每次job生成获取kafkaRDD,来给kafkaRDD确定分区数并且每个分区赋值offset范围的时候有牵扯,而这段代码就在DirectKafkaInputDStream#compute方法中。compute方法源码:
/*
获取当前生成KafkaRDD每个分区消费的offset的最大值,
进入latestLeaderOffsets进一步去看,可以发现下面一行代码
*/
val untilOffsets = clamp(latestLeaderOffsets(maxRetries))
/*
根据currentOffsets信息来获取最大的offset,
由于它只是根据currentOffsets信息来获取最大的offse