源码分析
Spark Streaming Direct Approach源码分析与填坑实践
一、背景
一直使用Spark Streaming Direct Approach方式消费Kafka进行实时数据处理,前几天迁移到新kafka集群的实时任务经常由于kafka集
群频繁的leader切换导致实时任务失败退出,对于kafka集群为什么会频繁进行leader切换,本文先不做分析,后续有机会再为大家分
享,本文主要分享给大家针对这种情况,应该如何保证我们的Streaming程序稳定运行,保证数据的时效性。本文只对核心方法进行说
明,因为对细节展开讲的话,篇幅太长。
二、问题列表
首先汇总下这些任务的报错信息:
1、Couldn't find leader offsets for Set([platrd-app-00-log,11]))
2、numRecords must not be negative
3、Beginning offset 184903933 is after the ending offset 184903745 for topic bigdata-mobile-lianjia-api-log partition 4. You
either provided an invalid fromOffset, or the Kafka topic has been damaged
好了,主要报错信息如上,接下来我们来定位下报错位置,分析下报错原因,考虑下如何解决上述问题
三、分析过程
问题发生了,首先肯定是百度、Google一番,然而,问题到了一定层次之后,根本找不到有效解决方案。即使找到相关文章、也会发现
同一个问题,解决方案五花八门、或者一个原创、n个副本在你面前,让人无语。现在最直接有效的方法只能是参考源码和官方文档了。
我们带着上述问题开始走读下这部分源码,下载指定spark版本后,找到 DirectKafkaInputDStream类,查看下这个类的compute方
法,此方法描述的是如何产生一个RDD的数据,在看具体源码前,先了解下Direct方式获取kafka数据的基本原理:
Streaming程序时定时执行用户自定义的处理逻辑,每个固定时间会产生一批数据供用户处理,对于Direct方式,每个可用时间会计算
出,本批次数据对应的kafka的offsets范围(通过用户传入的currentOffsets和计算后的untilOffsets进行范围确定),最终fetch这个范
围内的数据,供用户进行处理,我们来看下源码
参考图片中的注释,流程很简单:
1、获取untilOffsets,untilOffsets代表本批次的结束offsets,根据用户传入的currentOffsets和获取的untilOffsets等参数创建
KafkaRDD实例,KafkaRDD实例代表本批次的获取的用于处理的数据
2、构造一些描述信息,进行信息上报
评论0