书签 分享 收藏 举报 版权申诉 / 9

基于SPARKSTREAMING读取KAFKA数据的处理方法.pdf

  • 上传人:t****
  • 文档编号:6020343
  • 上传时间:2019-04-03
  • 格式:PDF
  • 页数:9
  • 大小:521.01KB
  • 摘要
    申请专利号:

    CN201611069230.9

    申请日:

    2016.11.29

    公开号:

    CN106776855A

    公开日:

    2017.05.31

    当前法律状态:

    实审

    有效性:

    审中

    法律详情:

    实质审查的生效IPC(主分类):G06F 17/30申请日:20161129|||公开

    IPC分类号:

    G06F17/30

    主分类号:

    G06F17/30

    申请人:

    上海轻维软件有限公司

    发明人:

    程永新; 谢涛; 王仁铮

    地址:

    200331 上海市普陀区祁连山南路2891弄105号2811室

    优先权:

    专利代理机构:

    上海科律专利代理事务所(特殊普通合伙) 31290

    代理人:

    袁亚军;金碎平

    PDF完整版下载: PDF下载
    内容摘要

    本发明公开了一种基于Spark??Streaming读取Kafka数据的处理方法,包括如下步骤:S1)利用Kafka将数据存储在话题中;S2)利用Spark??Streaming把实时输入数据流以时间片为单位切分成块;S3)预先根据Kafka数据失败记录数,设置SparkStreaming补数调度时间;S4)实时监控SparkStreaming读取Kafka数据过程;S5)通过SparkStreaming重新读取Kafka数据。本发明根据Kafka数据失败记录数设置SparkStreaming补数调度时间,实时监控读取过程并重新读取失败记录数进行补数,更加灵活、便捷地做到零丢数保证。

    权利要求书

    1.一种基于Spark Streaming读取Kafka数据的处理方法,其特征在于,包括如下步骤:
    S1)利用Kafka将数据存储在话题中,每个话题均包含若干可配置数量的分区;
    S2)利用Spark Streaming把实时输入数据流以时间片为单位切分成块,每个块均生成
    一个Spark Job处理;
    S3)预先根据Kafka数据失败记录数,设置SparkStreaming补数调度时间;
    S4)实时监控SparkStreaming读取Kafka数据的处理过程;
    S5)根据Kafka数据失败记录数和调度时间,通过SparkStreaming重新读取失败丢失的
    Kafka数据。
    2.如权利要求1所述的基于Spark Streaming读取Kafka数据的处理方法,其特征在于,
    所述步骤S3)使用关系型数据库创建两张数据库表,分别为调度表和失败记录数表,所述调
    度表中存放调度编号id,开始时间,结束时间,状态和创建时间信息,所述失败数记录表中
    存放失败记录id,偏移量,Kafka话题,Kafka节点列表信息,所述调度表中的调度编号id和
    失败数记录表的失败记录id为主外键关系。
    3.如权利要求2所述的基于Spark Streaming读取Kafka数据的处理方法,其特征在于,
    所述步骤S4)包括:在SparkStreaming读取Kafka数据过程中,如果对应的Kafka话题数据不
    为空,则获取到正在从Kafka读取到数据的偏移量,并将该数据偏移量、Kafka话题以及
    Kafka节点列表信息入库到关系型数据库失败数记录表中,如果数据处理异常,则修改数据
    表中的状态为失败。
    4.如权利要求3所述的基于Spark Streaming读取Kafka数据的处理方法,其特征在于,
    所述步骤S4)中SparkStreaming通过Direct方式直接连接到Kafka节点上,并通过
    createDirectStream方法获取到正在从Kafka读取到数据的偏移量,同时将调度表中的状
    态标识为正在进行中;当SparkStreaming对接Kafka读取处理数据过程中,出现异常造成程
    序不能正常执行,则修改调度表中的状态为失败。
    5.如权利要求4所述的基于Spark Streaming读取Kafka数据的处理方法,其特征在于,
    所述步骤S5)包括:首先根据调度表状态字段作为查询条件,扫描调度表,根据创建时间字
    段作为排序降序,得到最早的调度记录,然后获得调度编号id,以该字段作为查询失败数记
    录表条件,获得所有Kafka失败记录数,再根据Kafka话题和偏移量重新读取Kafka数据。
    6.如权利要求3所述的基于Spark Streaming读取Kafka数据的处理方法,其特征在于,
    所述步骤S4)先读取关系数据库中调度表和失败数记录表缓存到内存中,再通过线程定时
    更新缓存中的数据进行实时监控。

    说明书

    基于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数据进行处理。

    虽然本发明已以较佳实施例揭示如上,然其并非用以限定本发明,任何本领域技
    术人员,在不脱离本发明的精神和范围内,当可作些许的修改和完善,因此本发明的保护范
    围当以权利要求书所界定的为准。

    关 键  词:
    基于 SPARKSTREAMING 读取 KAFKA 数据 处理 方法
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:基于SPARKSTREAMING读取KAFKA数据的处理方法.pdf
    链接地址:https://www.zhuanlichaxun.net/p-6020343.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
    经营许可证编号:粤ICP备2021068784号-1