掌桥专利:专业的专利平台
掌桥专利
首页

一种自定义保存Kafka Offset的方法

文献发布时间:2023-06-19 10:16:30



技术领域

本发明涉及大数据实时计算技术领域,特别涉及一种自定义保存Kafka Offset的方法。

背景技术

近年来,DT(Data Technology,数据处理技术)这个术语逐渐走进人们的视野,DT也被视为在未来社会发展的形态之一。数据资源成为最为宝贵的资源之一,如何采集、存储和计算数据成为了当前热点话题,Spark作为当前大数据领域内使用最多的技术,引起了工业界的广泛关注。

Spark是基于内存的分布式计算框架,并且对Hadoop生态系统有高度的支持,比如支持从HDFS、Hbase、Hive等分布式文件系统读取数据。目前,Spark发展非常迅速,支持的持久层框架越来越多,随着SparkSQL的出现,通过SparkSQL直接访问Hive更加方便,数据开发人员直接用SQL语句便可以做数据分析,降低了Spark和大数据开发难度。同时SparkStreaming/Structured Streaming作为目前最为流行的一种实时流计算框架,具有良好的扩展性、高吞吐量以及容错机制,能够满足多种场景应用,在大数据时代,企业搭建实时计算平台中占据着举足轻重的地位。

Spark+Hadoop的组合,是未来大数据领域最热门的组合,也是最有前景的组合。Structured Streaming是Spark2.0版本提出的新的实时流框架,由于现在SparkStreaming已经非常稳定,研究重点已转移到Structured Streaming。

为了保证之前消费并输出过的数据在程序重启后不再重复消费,而是从上次断开(停止或者报错导致)的位置开始消费,本发明提出了一种自定义保存Kafka Offset的方法。

发明内容

本发明为了弥补现有技术的缺陷,提供了一种简单高效的自定义保存KafkaOffset的方法。

本发明是通过如下技术方案实现的:

一种自定义保存Kafka Offset的方法,其特征在于:使用Spark程序计算每个批次数据中最大offset消息,并将获得的最大offset消息解析为json字符串,然后用源码HDFSMetadataLog将json字符串保存到HDFS目录中。

包括以下步骤:

第一步,获取最新的offset消息作为Spark Structured Streaming程序启动时对应的Kafka的起始偏移量Starting Offsets;

第二步,获取该批次数据中最大offset消息,并将其解析为json字符串;

第三步,在Spark程序消费完该批次数据后将json字符串和对应的批号batchId添加到检查点Check Point目录中。

所述第一步中,用Offset日志的getLatest方法获取最新的offset消息和批号batchId,然后将获取的最新offset消息作为Spark Structured Streaming程序启动时对应的Kafka的起始偏移量Starting Offsets。

所述第一步中,首先创建对应HDFS目录的源码HDFSMetadataLog,并在SparkStructured Streaming程序启动时首先使用源码HDFSMetadataLog读取检查点CheckPoint目录,从中获取所述Offset日志。

Spark程序根据HDFS的检查点CheckPoint目录创建源码HDFSMetadataLog。

所述第二步中,获取该批次数据中每个主题topic和各分区partition对应的最大offset消息,然后将获得的最大offset消息解析为对应格式的json字符串。

先将主题topic,各分区partition以及offset消息转化为HashMap,然后将HashMap转化为json字符串。

Spark程序将每个批次对应的DataFrame按照主题topic和各分区partition分组汇总group by,求出最大的offset消息,封装成HashMap

本发明的有益效果是:该自定义保存Kafka Offset的方法,能够保证之前消费并输出过的数据在程序重启后不再重复消费,而是从上次断开(停止或者报错导致)的位置开始消费,不但能够避免程序重启时报错,并且方便可靠,不用单独维护其他的外部数据源,降低了维护成本。

具体实施方式

为了使本技术领域的人员更好的理解本发明中的技术方案,下面将结合本发明实施例,对本发明实施例中的技术方案进行清楚,完整的描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

在程序消费完Kafka中的数据后,手动保存每个主题topic对应的每个分区的offset,这样在Spark程序停止或报错退出后重启时,之前消费并且输出过的数据不再重复消费,从上次断开(停止或者报错导致)的位置继续读取消息,即exactly-once语义。虽然Spark自带检查点CheckPoint机制可以保存offset消息和状态等信息,也可以在程序挂掉后从保存的offset消息中读取信息,从而从失败中恢复数据,且使用起来也比较方便。但如果对Spark程序进行升级,那么检查点CheckPoint的数据就无法使用。同时,技术人员发现Spark的检查点CheckPoint在目前使用的spark2.4版本中存在bug,没有检查offset json字符串为空的情况,因而时常导致程序重启时报错。为了保障程序安全稳定运行,不能使用Spark的检查点CheckPoint方式。

该自定义保存Kafka Offset的方法,使用Spark程序计算每个批次数据中最大offset消息,并将获得的最大offset消息解析为json字符串,然后用源码HDFSMetadataLog将json字符串保存到HDFS目录中。

包括以下步骤:

第一步,获取最新的offset消息作为Spark Structured Streaming程序启动时对应的Kafka的起始偏移量Starting Offsets;

第二步,获取该批次数据中最大offset消息,并将其解析为json字符串;

第三步,在Spark程序消费完该批次数据后将json字符串和对应的批号batchId添加到检查点Check Point目录中。

所述第一步中,首先创建对应HDFS目录的源码HDFSMetadataLog,并在SparkStructured Streaming程序启动时首先使用源码HDFSMetadataLog读取检查点CheckPoint目录,从中获取Offset日志;然后用Offset日志的getLatest方法获取最新的offset消息和批号batchId;

上述第一步的部分过程实现代码如下:

将获取的最新offset消息作为Spark Structured Streaming程序启动时对应的Kafka的起始偏移量Starting Offsets。具体实现代码如下:

Spark程序根据HDFS的检查点CheckPoint目录创建源码HDFSMetadataLog。

用于保存Offset的源码HDFSMetadataLog与Spark的检查点Check Point机制相似,但是解决了检查点Check Point的弊端,Offset保存在HDFS文件系统中更加方便可靠,不用单独维护其他的外部数据源。

所述第二步中,获取该批次数据中每个主题topic和各分区partition对应的最大offset消息,然后将获得的最大offset消息解析为对应格式的json字符串。

Spark程序将每个批次对应的DataFrame按照主题topic和各分区partition分组汇总group by,求出最大的offset消息,封装成HashMap

DataFrame是一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

具体实现代码如下:

然后将HashMap转化为json字符串。具体实现代码如下:

在每个批次消费完数据后,将json字符串和对应的batchId保存到HDFS中即可。

以上所述的实施例,只是本发明具体实施方式的一种,本领域的技术人员在本发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。

相关技术
  • 一种自定义保存Kafka Offset的方法
  • 一种用于小麦胚芽高效保存的保存剂、保存组件以及保存方法
技术分类

06120112481385