基于Spark Streaming读取Kafka数据的处理方法技术领域
本发明涉及一种Kafka数据处理方法,尤其涉及一种基于Spark Streaming读取
Kafka数据的处理方法。
背景技术
Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理
引擎是Spark,也就是把Spark Streaming的输入数据按照batch size(如1秒)分成一段一
段的数据(Discretized Stream),每一段数据都转换成Spark中的RDD(Resilient
Distributed Dataset),然后将Spark Streaming中对DStream的Transformation操作变为
针对Spark中对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。整
个流式计算根据业务的需求可以对中间的结果进行叠加,或者存储到外部设备。图1显示了
Spark Streaming的整个流程。
Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为
Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它
主要用于处理活跃的流式数据,如图2所示。
众所周知,大数据时代对数据处理的实时性、稳定性、准确性要求越来越高;现在
兴起的组合架构有SparkStreaming对接Kafka,借助SparkStreaming基于内存迭代计算优
势和Kafka高并发数据分发能力,进而达到数据处理的实时性;但SparkStreaming对接
kafka过程中,仍然难免会出现潜在的数据丢失场景,具体过程如下:
1、两个Exectuor已经从接收器中接收到输入数据,并将它缓存到Exectuor的内存
中;2、接收器通知输入源数据已经接收;3、Exectuor根据应用程序的代码开始处理已经缓
存的数据;4、这时候Driver突然挂掉了;5、从设计的角度看,一旦Driver挂掉之后,它维护
的Exectuor也将全部被kill;6、既然所有的Exectuor被kill了,所以缓存到它们内存中的
数据也将被丢失。结果,这些已经通知数据源但是还没有处理的缓存数据就丢失了;7、缓存
的时候不可能恢复,因为它们是缓存在Exectuor的内存中,所以数据被丢失了。
由上可见,急需一种防止零丢数的方法来保证SparkStreaming对接Kafka数据处
理稳定性。
发明内容
本发明所要解决的技术问题是提供一种基于Spark Streaming读取Kafka数据的
处理方法,能够有效防止数据丢失,在失败恢复之后从Kafka中重新消费数据,从而在
SparkStreaming程序异常情况下,更加灵活、便捷地做到零丢数保证。
本发明为解决上述技术问题而采用的技术方案是提供一种基于Spark Streaming
读取Kafka数据的处理方法,包括如下步骤:S1)利用Kafka将数据存储在话题中,每个话题
均包含若干可配置数量的分区;S2)利用Spark Streaming把实时输入数据流以时间片为单
位切分成块,每个块均生成一个Spark Job处理;S3)
预先根据Kafka数据失败记录数,设置SparkStreaming补数调度时间;S4)实时监
控SparkStreaming读取Kafka数据的处理过程;S5)根据Kafka数据失败记录数和调度时间,
通过SparkStreaming重新读取失败丢失的Kafka数据。
上述的基于Spark Streaming读取Kafka数据的处理方法,其中,所述步骤S3)使用
关系型数据库创建两张数据库表,分别为调度表和失败记录数表,所述调度表中存放调度
编号id,开始时间,结束时间,状态和创建时间信息,所述失败数记录表中存放失败记录id,
偏移量,Kafka话题,Kafka节点列表信息,所述调度表中的调度编号id和失败数记录表的失
败记录id为主外键关系。
上述的基于Spark Streaming读取Kafka数据的处理方法,其中,所述步骤S4)包
括:在SparkStreaming读取Kafka数据过程中,如果对应的Kafka话题数据不为空,则获取到
正在从Kafka读取到数据的偏移量,并将该数据偏移量、Kafka话题以及Kafka节点列表信息
入库到关系型数据库失败数记录表中,如果数据处理异常,则修改数据表中的状态为失败。
上述的基于Spark Streaming读取Kafka数据的处理方法,其中,所述步骤S4)中
SparkStreaming通过Direct方式直接连接到Kafka节点上,并通过createDirectStream方
法获取到正在从Kafka读取到数据的偏移量,同时将调度表中的状态标识为正在进行中;当
SparkStreaming对接Kafka读取处理数据过程中,出现异常造成程序不能正常执行,则修改
调度表中的状态为失败。
上述的基于Spark Streaming读取Kafka数据的处理方法,其中,所述步骤S5)包
括:首先根据调度表状态字段作为查询条件,扫描调度表,根据创建时间字段作为排序降
序,得到最早的调度记录,然后获得调度编号id,以该字段作为查询失败数记录表条件,获
得所有Kafka失败记录数,再根据Kafka话题和偏移量重新读取Kafka数据。
上述的基于Spark Streaming读取Kafka数据的处理方法,其中,所述步骤S4)先读
取关系数据库中调度表和失败数记录表缓存到内存中,再通过线程定时更新缓存中的数据
进行实时监控。
本发明对比现有技术有如下的有益效果:本发明提供的基于Spark Streaming读
取Kafka数据的处理方法,根据Kafka数据失败记录数,设置SparkStreaming补数调度时间,
实时监控读取过程并重新读取失败记录数进行补数,从而能够有效防止数据丢失,在失败
恢复之后从Kafka中重新消费数据,在SparkStreaming程序异常情况下,更加灵活、便捷地
做到零丢数保证。
附图说明
图1为本发明使用的Spark Streaming架构图;
图2为本发明使用的Kafka处理流式数据示意图;
图3为本发明的调度表和失败数记录表模型结构图;
图4为本发明的基于Spark Streaming读取Kafka数据的监控流程图;
图5为本发明的失败记录补数流程图。
具体实施方式
下面结合附图和实施例对本发明作进一步的描述。
本发明提供的基于Spark Streaming读取Kafka数据的处理方法,使用关系型数据
库创建两张数据库表,分别为调度表(control)、失败记录数表(fai lure)。其中调度表存
放的是调度信息,包括调度编号id,开始时间,结束时间,状态,创建时间等信息。失败数记
录表存放具体失败数据记录详细信息,包括失败记录id,偏移量,话题(topic),Kafka节点
列表等信息。其中调度表里面的调度编号id跟失败数记录表的id为主外键关系。
SparkStreaming对接Kafka读取处理数据过程中,首先会先通过SparkStreaming
的createDirectStream方法,获取到正在从Kafka读取到数据的偏移量,并且将该数据偏移
量信息入库到关系型数据库失败数记录表中,状态表示为正在进行中。
当SparkStreaming对接Kafka读取处理数据过程中,出现异常造成程序不能正常
执行,根据捕获到的Exception信息,结合相应的数据偏移量信息,修改状态为失败;反之修
改为成功。
结合失败数记录表,可以手动设置调度表,进行失败补数设置,当重新启动
SparkStreaming程序时,会扫描调度表和失败数记录表,得到补数策略,重新读取Kafka指
定的topic上的数据。
本发明的SparkStreaming获取Kafka数据的两种方式Receiver与Direct的方式,
Receiver方式是通过zookeeper来连接Kafka队列,Direct方式是直接连接到Kafka的节点
上获取数据了。基于Receiver的方式,这种方式使用Receiver来获取数据。Receiver是使用
Kafka的高层次Consumer API来实现的。Receiver从Kafka中获取的数据都是存储在Spark
Executor的内存中的,然后Spark Streaming启动的job会去处理那些数据。然而,在默认的
配置下,这种方式可能会因为底层的失败而丢失数据。如果要启用高可靠机制,让数据零丢
失,就必须启用Spark Streaming的预写日志机制(Write Ahead Log,WAL)。该机制会同步
地将接收到的Kafka数据写入分布式文件系统(比如HDFS)上的预写日志中;但Receiver的
方式存在缺点:1、WAL减少了接收器的吞吐量,因为接受到的数据必须保存到可靠的分布式
文件系统中;2、对于一些输入源来说,它会重复相同的数据。比如当从Kafka中读取数据,先
要在Kafka的brokers中保存一份数据,而且还需在Spark Streaming中保存一份。本发明的
技术方案是以SparkStreaming获取kafka数据Direct方式为前提下进行的,采集本发明的
技术方案,相对于第一种零丢数方式,能带来显著的有益效果,具体优点如下:1、不再需要
Kafka接收器,Exectuor直接采用Simple Consumer API从Kafka中消费数据;2、不再需要
WAL机制,仍然可以从失败恢复之后从Kafka中重新消费数据;3、exactly-once语义得以保
存,不再从WAL中读取重复的数据;4、能保证SparkStreaming程序异常情况下,更加灵活、便
捷地做到零丢数保证。
本发明使用的Spark Streaming是建立在Spark上的实时计算框架,通过它提供的
丰富的API、基于内存的高速执行引擎,用户可以结合流式、批处理和交互试查询应用;随着
大数据的发展,人们对大数据的处理要求也越来越高,原有的批处理框架MapReduce适合离
线计算,却无法满足实时性要求较高的业务。因此,怎么去保证Spark Streaming获取kafka
数据而又高效、稳定是非常重要的。针对Spark Streaming获取kafka数据丢失数据的问题,
本发明提供的Spark Streaming读取kafka失败补数的方法,主要涉及调度及监控模型的设
计、补数调度中心设计、监控中心设计等三方面。具体实施过程如下:
1、在关系型数据库中创建调度表(control)、失败记录数表(failure),具体表结
构如图3所示。
2、编程实现监控中心服务,SparkStreaming对接Kafka读取处理数据过程中,首先
会先通过SparkStreaming的createDirectStream方法,获取到正在从kafka读取到数据的
偏移量,并且将该数据偏移量(offset)等信息入库到关系型数据库失败数记录表中,状态
表示为正在进行中。当SparkStreaming对接kafka读取处理数据过程中,出现异常造成程序
不能正常执行,根据捕获到的Exception信息,结合相应的数据偏移量信息,调用update修
改状态为失败;反之修改为成功,如图4所示。
3、补数调度中心接口,是调度中心程序,如图5所示,首先根据调度表状态字段作
为查询条件,扫描调度表,根据创建时间字段作为排序降序,得到最早的调度记录,然后获
得调度编号ID,以该字段作为查询失败数记录表条件,获得所有Kafka失败记录数,再根据
topic和偏移量(offset)重新读取Kafka数据进行处理。
虽然本发明已以较佳实施例揭示如上,然其并非用以限定本发明,任何本领域技
术人员,在不脱离本发明的精神和范围内,当可作些许的修改和完善,因此本发明的保护范
围当以权利要求书所界定的为准。