重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
关于Spark Streaming感知kafka动态分区的问题该怎么理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联公司是一家集网站建设,大通企业网站建设,大通品牌网站建设,网站定制,大通网站建设报价,网络营销,网络优化,大通网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
小编主要是讲解Spark Streaming与kafka结合的新增分区检测的问题。
读阅前是需要了解Spark Streaming的原理和源码结构基础。
kafka 0.8版本
进入正题,之所以会有今天题目的疑惑,是由于在08版本kafka和Spark Streaming结合的DirectStream这种形式的API里面,是不支持kafka新增分区或者topic检测的。而这个问题,对于很多业务增长比较明显的公司都是会有碰到相应的问题。
比如,原来的公司业务增长比较明显,那么kafka吞吐量,刚开始创建的topic数目和分区数目可能满足不了并发需求,需要增加分区。新增加的分区会有生产者往里面写数据,而Spark Streaming跟kafka 0.8版本结合的API是满足不了动态发现kafka新增topic或者分区的需求的。
这么说有什么依据吗?我们做项目不能人云亦云,所以我们可以从源码入手验证我们的想法。
我们在这里不会详细讲Spark Streaming源码,但是我们可以在这里思考一下,Spark Streaming分区检测是在哪做的?
很明显对于批处理的Spark Streaming任务来说,分区检测应该在每次job生成获取kafkaRDD,来给kafkaRDD确定分区数并且每个分区赋值offset范围的时候有牵扯,而这段代码就在DirectKafkaInputDStream#compute方法中。(看过浪尖Spark Streaming源码视频教程的肯定会知道)
那么我们就贴出这块源码去验证我们的想法,首先compute方法的第一行:
val untilOffsets = clamp(latestLeaderOffsets(maxRetries))
这里面获取的是当前生成KafkaRDD每个分区消费的offset的最大值,那么我们需要进入latestLeaderOffsets进一步去看,可以发现下面一行代码:
val o = kc.getLatestLeaderOffsets(currentOffsets.keySet)
这个是根据currentOffsets信息来获取最大的offset,由此此处继续深入发现,由于它只是根据currentOffsets信息来获取最大的offset,没有去感知新增的分区,所以Spark Streaming与kafka 0.8结合是不能动态感知分区的。
kafka 0.10版本
相似的我们也可以直接去看kafka 0.10这块的源码去检查,他是否会动态生成kafka分区。
进入DirectKafkaInputDStream的compute,看到的第一行代码也是:
val untilOffsets = clamp(latestOffsets())
在latestOffsets里面,有了新的大陆:
关于关于Spark Streaming感知kafka动态分区的问题该怎么理解问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。