发明内容
本发明的主要目的在于提供一种批量数据处理方法、装置、终端设备及存储介质,旨在解决现有技术中读取不同字段格式的大批量数据,并同步转换成DataSet时比较困难的技术问题。
为实现上述目的,本发明提供一种批量数据处理方法,所述批量数据处理方法包括以下步骤:
在kafka消息队列中创建一个空的Topic;
在spark主函数中创建directStream;
通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic;
在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中。
可选地,所述通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic,包括:
通过所述directStream将内存数据库中的数据批量读取到预设清单中;
将所述预设清单中的数据转换为JavaRDD;
将所述JavaRDD中的每条数据进行protobuf转化;
将转换后的每条数据转换成对应的Object,并将所述Object存储到所述JavaRDD中;
通过sparkSession将所述JavaRDD转换为DataSet,并注册与所述DataSet对应的临时表;
将所述DataSet和对应的临时表写入所述Topic。
可选地,所述在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中,包括:
在将所述内存数据库中的数据读取完成后,通过Spark算子或者TableAPI对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中。
可选地,所述在kafka消息队列中创建一个空的Topic之前,所述批量数据处理方法还包括:
将业务数据批量加载至内存数据库中。
可选地,所述将业务数据批量加载至内存数据库中之后,所述批量数据处理方法还包括:
在业务数据有变更时,将变更后的业务数据覆盖所述内存数据库中变更前的业务数据。
可选地,所述将业务数据批量加载至内存数据库中,包括:
对业务数据进行压缩,并将压缩后的业务数据批量加载至内存数据库中。
可选地,所述对业务数据进行压缩,并将压缩后的业务数据批量加载至内存数据库中,包括:
通过protobuf方式对所述业务数据进行压缩,并将压缩后的业务数据批量加载至内存数据库中。
此外,为实现上述目的,本发明还提供一种批量数据处理装置,所述批量数据处理装置包括:
信息创建模块,用于在kafka消息队列中创建一个空的Topic;
函数创建模块,用于在spark主函数中创建directStream;
数据写入模块,用于通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic;
结果写入模块,用于在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中。
此外,为实现上述目的,本发明还提供一种终端设备,所述终端设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的批量数据处理程序,所述批量数据处理程序配置为实现如上所述的批量数据处理方法的步骤。
此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有批量数据处理程序,所述批量数据处理程序被处理器执行时实现如上所述的批量数据处理方法的步骤。
本发明通过在kafka消息队列中创建一个空的Topic,在spark主函数中创建directStream,通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic,在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中,由于spark从内存数据库中读取批量数据,并行转换成DataSet,解决了使用Spark结合kafka不能解决的业务需求,从而大批量数据同步转换成Spark DataSet。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
参照图1,图1为本发明批量数据处理方法第一实施例的流程示意图。
在第一实施例中,所述批量数据处理方法包括以下步骤:
S10:在kafka消息队列中创建一个空的Topic。
需要说明的是,在kafka消息队列中,Topic是一个存储消息的逻辑概念,可以认为是一个消息集合。每条消息发送到kafka集群的消息都有一个类别。物理上来说,不同的Topic的消息是分开存储的,每个Topic可以有多个生产者向它发送消息,也可以有多个消费者去消费其中的消息。
应理解的是,kafka中最基本的数据单元就是消息,而一条消息其实是由Key+Value组成的(Key是可选项,可传空值,Value也可以传空值)键值对。
S20:在spark主函数中创建directStream。
可理解的是,在创建directStream时,设置N秒消费一次所述Topic中的数据,例如:将N设置为10秒、15秒或20秒,又或者设置为1分钟、2分钟或3分钟等,本实施例对此不加以限制。
S30:通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic。
在具体实现中,可在所述directStream中,启动多个Job并行读取内存数据中的数据,具体分为四个Job,分别读取基础设置、行情资讯、业务数据、系统配置。其中业务数据采用事务,保证数据的一致性。
需要说明的是,对于所述内存数据库而言,可采用redis内存数据库,当然还可采用ElasticSearch内存数据库,本实施例对此不加以限制。
为便于批量读取数据,本实施例中,可先通过所述directStream将内存数据库中的数据批量读取到预设清单中,然后将所述预设清单中的数据转换为JavaRDD,再将所述JavaRDD中的每条数据进行protobuf转化,之后将转换后的每条数据转换成对应的Object,并将所述Object存储到所述JavaRDD中,接着通过sparkSession将所述JavaRDD转换为DataSet,并注册与所述DataSet对应的临时表,最后将所述DataSet和对应的临时表写入所述Topic。
在具体实现中,每个Topic可以划分多个分区(每个Topic至少有一个分区),同一Topic下的不同分区包含的消息是不同的。每个消息在被添加到分区时,都会被分配一个offset,它是消息在此分区中的唯一编号,Kafka通过offset保证消息在分区内的顺序,offset的顺序不跨分区,即Kafka只保证在同一个分区内的消息是有序的。
S40:在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中。
可理解的是,为便于对数据进行处理,在将所述内存数据库中的数据读取完成后,通过spark算子或者TableAPI对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中,数据写入后,即可等待下一轮计算开始。
本实施例通过在kafka消息队列中创建一个空的Topic,在spark主函数中创建directStream,通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic,在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中,由于spark从内存数据库中读取批量数据,并行转换成DataSet,解决了使用Spark结合kafka不能解决的业务需求,从而大批量数据同步转换成Spark DataSet。
如图2所示,基于第一实施例提出本发明批量数据处理方法第二实施例,本实施例中,步骤S10之前,所述批量数据处理方法还包括:
S01:将业务数据批量加载至内存数据库中。
需要说明的是,为便于后续的业务数据处理,本实施例中,可先将业务数据批量加载至内存数据库中。
可理解的是,可将业务系统或其他计算程序所产生的业务数据在进程启动时,将业务数据批量加载至内存数据库中。
由于业务数据的数据量较大,可在批量写入之后,如果有业务数据的变更,采用实时更新方式,覆盖原数据,增加数据处理速度,本实施例中,可在业务数据有变更时,将变更后的业务数据覆盖所述内存数据库中变更前的业务数据。
为提高数据稳定性,本实施例中,步骤S01中,可对业务数据进行压缩,并将压缩后的业务数据批量加载至内存数据库中,由于是在数据写入过程中采用压缩的方式,如protobuf,降低数据容量,减少内存数据库的内存压力,增加数据的网络传输速度,进而增强系统的稳定性。
也就是说,在具体实现中,可通过protobuf方式对所述业务数据进行压缩,并将压缩后的业务数据批量加载至内存数据库中。
实验表明,采用protobuf压缩之后,内存数据库中数据容量显著降低,且读取内存数据库中的数据时稳定性也显著增强。
如下表所示,为某100万条数据采用各种压缩方式和直接将键值对转换成json字符串的数据容量对比,可以看出,压缩之后数据容量显著降低。
数据协议 |
有无加密 |
条数(万) |
大小(M) |
Protobuf |
Y |
100 |
292.11 |
Json |
N |
100 |
532.26 |
Snappy |
N |
100 |
379.59 |
Snappy+Base64 |
Y |
100 |
481.99 |
根据上表可以看出,通过protobuf压缩之后数据容量显著降低。
在具体实现中,在采用压缩和不采用压缩存储数据时,当读取内存数据库的数据,内存数据库的内存变化,内存数据库中内存变化更稳定,系统稳定性更好。
可理解的是,在所述内存数据库中数据采用hash格式存储,数据更新时直接覆盖Key中的Value,其中键值为Protobuf协议数据,例如:CPAHEgpTUzEwMDAwMDAxGP2ZygkiATEqATEyBTExMDExOggyMjEwNz BTWkEAAAAAAOClQEkAAAAAQOb1QFF7FK5H4XoEQFkAAAAAAABZQGEAAAAAAABZQGkAAAAAAABZQHEAAAAAAABZQHkAAAAAAABZQ IEBAAAAAAAAWUCJAQAAAAAAAFlAkQEAAAAAAABZQA==
需要说明的是,本实施例中相较于消费同一个kafka Topic中的数据,结合spark+内存数据库可以做到同时读取各种表结构的数据,解决了spark实时计算批量数据的问题。
此外,本发明实施例还提出一种批量数据处理装置,参照图3,所述批量数据处理装置包括:
信息创建模块10,用于在kafka消息队列中创建一个空的Topic;
函数创建模块20,用于在spark主函数中创建directStream;
数据写入模块30,用于通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic;
结果写入模块40,用于在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中。
本实施例通过上述方案,通过在kafka消息队列中创建一个空的Topic,在spark主函数中创建directStream,通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic,在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中,由于spark从内存数据库中读取批量数据,并行转换成DataSet,解决了使用Spark结合kafka不能解决的业务需求,从而大批量数据同步转换成Spark DataSet。
需要说明的是,上述装置中的各模块可用于实现上述方法中的各个步骤,同时达到相应的技术效果,本实施例在此不再赘述。
参照图4,图4为本发明实施例方案涉及的硬件运行环境的终端设备的结构示意图。
如图4所示,该终端设备可以包括:处理器1001,例如CPU,通信总线1002、用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
在具体实现中,所述终端设备为PC机、笔记本电脑或平板电脑等电子设备,本实施例对此不加以限制。
本领域技术人员可以理解,图4中示出的结构并不构成对终端设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图4所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及批量数据处理程序。
在图4所示的终端设备中,网络接口1004主要用于与外部网络进行数据通信;用户接口1003主要用于接收用户的输入指令;所述终端设备通过处理器1001调用存储器1005中存储的批量数据处理程序,并执行以下操作:
在kafka消息队列中创建一个空的Topic;
在spark主函数中创建directStream;
通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic;
在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中。
进一步地,处理器1001可以调用存储器1005中存储的批量数据处理程序,还执行上述批量数据处理方法中的其他步骤,同时达到相应的技术效果,本实施例在此不再赘述。
本实施例通过上述方案,通过在kafka消息队列中创建一个空的Topic,在spark主函数中创建directStream,通过所述directStream从内存数据库中批量读取数据,并将读取的数据写入所述Topic,在将所述内存数据库中的数据读取完成后,对所述Topic中的数据进行处理,并将处理结果写入到kafka消息队列中,由于spark从内存数据库中读取批量数据,并行转换成DataSet,解决了使用Spark结合kafka不能解决的业务需求,从而大批量数据同步转换成Spark DataSet。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。