一种提升数据ETL性能的方法及装置
文献发布时间:2023-06-19 19:30:30
技术领域
本发明涉及数据ETL性能领域,尤其是一种提升数据ETL性能的方法及装置。
背景技术
传统使用Spark或者Flink进行数据ETL的操作,存在的主要性能瓶颈如下:
(1)基于Java/Scala语言的JVM语言,进行转换、清洗和解析数据(例如JSON)等,相对于C/C++耗时,占用内存高,当处理超大记录时,容易OOM。
(2)传统的数据处理、数据转换或者函数调用,是拆分成一个个的操作符,然后进行分支的判断和计算,每条数据都要调用一次操作符,数据量大时,非常耗时。
如图1所示,计算机不同的存储介质,计算性能的对比。从左往右,计算响应的速度是越来越慢。在CPU(寄存器)中数据处理的性能是最高的。在CPU(寄存器)中访问数据的速度是在内存中访问数据的速度的300倍,是在磁盘中访问数据的速度的3000万倍。
(3)传统的数据处理,不能实现运行时代码自动生成
如图2所示,左边是传统的数据库管理系统中对函数调用的底层的数据处理的模型。这里是将函数的表达式拆分成一个个的操作符,然后进行分支的判断和计算。右边是运行时代码自动生成,首先将表达式转换成对应的代码,然后编译执行。通过代码自动生成的方式,可以消除大量操作符的调用,并且是没有ifelse的分支。
发明内容
为了解决现有技术存在的上述问题,本发明提供一种提升数据ETL性能的方法及装置,通过ClickHouse提供的Clickhouse-Local的二进制工具,并在该工具源码的基础之上进行自定义函数的扩展,实现对数据的处理和异常容错,并利用其向量化执行引擎和代码自动生成能力,对数据进行处理处理,在HDFS生成大数据平台Hive表格式的文件,并移动至Hive表,刷新Hive表分区(如果存在分区);向量化执行引擎就是利用SIMD指令集,能够执行并行的操作,对于执行相同操作的数据,一条SIMD指令可以同时处理多条数据,在CPU(寄存器)层面做了大量的优化,具备高性能的数据处理能力。
为实现上述目的,本发明采用下述技术方案:
在本发明一实施例中,提出了一种提升数据ETL性能的方法,该方法包括:
通过ClickHouse提供的Clickhouse-Local工具,并在该工具源码的基础之上自定义数据处理函数;
通过自定义的数据处理函数,利用CPU的SIMD指令集,对数据进行处理和异常容错,生成大数据平台格式的数据文件写入目标存储,并移动至Hive表,如果Hive表存在分区,则刷新Hive表分区。
进一步地,对于异常无法处理的数据,通过自定义的数据处理函数,执行过滤或者使用单独的字段专门存储。
进一步地,每个分布式数据集的分区创建一条利用CPU的SIMD指令集来处理数据的管道,并在每个分区的管道中创建物化视图,并指定HDFS引擎基表;每个分布式数据集的分区中的数据以迭代器的形式存在。
进一步地,物化视图的创建规则如下:
物化视图的创建语句,在AS关键字的后面通过SQL实现数据处理;
自定义的数据处理函数,对传入的数据进行处理,返回两列:第一列为无法处理的异常数据,第二列为正常处理数据,以嵌套类型返回。;
通过where条件对数据进行过滤;
在select语句的后面,对嵌套字段的数据进行展开,同时对展开的嵌套字段的数据使用任意的ClickHouse函数进行处理,处理后的数据返回,并存入HDFS引擎基表;
临时表的数据来源为标准输入的数据;
当数据插入临时表,物化视图自动执行数据处理,将处理后的数据写入HDFS引擎基表。
进一步地,HDFS引擎基表的创建规则如下:
基表的表引擎为HDFS,HDFS引擎可指定数据存储的HDFS路径以及文件格式;
创建基表时,字段名称和字段数据类型与物化视图的SQL逻辑返回的字段和字段数据类型保持一致;
数据存储的HDFS路径作为临时目录,通过分区编号进行标识,分区编号根据所在的分区进行动态调整。
在本发明一实施例中,还提出了一种提升数据ETL性能的装置,该装置包括:
函数定义模块,用于通过ClickHouse提供的Clickhouse-Local工具,并在该工具源码的基础之上自定义数据处理函数;
数据处理模块,用于通过自定义的数据处理函数,利用CPU的SIMD指令集,对数据进行处理和异常容错,生成大数据平台格式的数据文件写入目标存储,并移动至Hive表,如果Hive表存在分区,则刷新Hive表分区。
进一步地,对于异常无法处理的数据,通过自定义的数据处理函数,执行过滤或者使用单独的字段专门存储。
进一步地,每个分布式数据集的分区创建一条利用CPU的SIMD指令集来处理数据的管道,并在每个分区的管道中创建物化视图,并指定HDFS引擎基表;每个分布式数据集的分区中的数据以迭代器的形式存在。
进一步地,物化视图的创建规则如下:
物化视图的创建语句,在AS关键字的后面通过SQL实现数据处理;
自定义的数据处理函数,对传入的数据进行处理,返回两列:第一列为无法处理的异常数据,第二列为正常处理数据,以嵌套类型返回。;
通过where条件对数据进行过滤;
在select语句的后面,对嵌套字段的数据进行展开,同时对展开的嵌套字段的数据使用任意的ClickHouse函数进行处理,处理后的数据返回,并存入HDFS引擎基表;
临时表的数据来源为标准输入的数据;
当数据插入临时表,物化视图自动执行数据处理,将处理后的数据写入HDFS引擎基表。
进一步地,HDFS引擎基表的创建规则如下:
基表的表引擎为HDFS,HDFS引擎可指定数据存储的HDFS路径以及文件格式;
创建基表时,字段名称和字段数据类型与物化视图的SQL逻辑返回的字段和字段数据类型保持一致;
数据存储的HDFS路径作为临时目录,通过分区编号进行标识,分区编号根据所在的分区进行动态调整。
在本发明一实施例中,还提出了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现前述提升数据ETL性能的。
在本发明一实施例中,还提出了一种计算机可读存储介质,计算机可读存储介质存储有执行提升数据ETL性能的计算机程序。
有益效果:
1、本发明利用Spark或者Flink丰富的生态系统,接入数据源,数据处理通过向量化执行引擎,实现了高性能的数据处理。
2、本发明对于无法处理的数据,具备容错功能。
3、本发明轻量级,使用简单,无需部署Clickhouse-Server,数据处理逻辑通过Clickhouse-Local工具自定义的函数实现,在Spark/Flink代码中,只需要将数据通过标准输入传递给Clickhouse-Local工具即可完成处理。
附图说明
图1是计算机不同存储介质的计算性能对比图;
图2是传统函数调用与代码自动生成的对比图;
图3是本发明提升数据ETL性能的方法流程示意图;
图4是本发明提升数据ETL性能的装置结构示意图;
图5是本发明计算机设备结构示意图。
具体实施方式
下面将参考若干示例性实施方式来描述本发明的原理和精神,应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本发明,而并非以任何方式限制本发明的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
本领域技术人员知道,本发明的实施方式可以实现为一种装置、装置、节点、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
本发明的实施方式,提出了一种提升数据ETL性能的方法及装置,通过ClickHouse提供的Clickhouse-Local工具,并在该工具源码的基础之上进行自定义函数的扩展,实现对数据的处理和异常容错,并利用其向量化执行引擎和代码自动生成能力,对数据进行处理处理,在HDFS生成大数据平台格式的数据文件,并移动至Hive表,刷新Hive表分区(如果存在分区)。
下面参考本发明的若干代表性实施方式,详细阐释本发明的原理和精神。
图3是本发明提升数据ETL性能的方法流程示意图。如图1所示,该方法包括:
1、实现向量化执行引擎的数据处理函数
ClickHouse提供了一个叫做Clickhouse-Local的二进制工具,可以理解成一个单机版的ClickHouse,但是不需要启动任何的服务,就可以使用。具备的特性如下:
(a)实现了大部分的ClickHouseServer的功能,例如表引擎、函数和查看语句等。
(b)不需要依赖ClickHouseServer,能够独立运行。
(1)ClickHouse-Local的使用示例如下:
echo"a b c "|./clickhouse-local-S"nameString"-Ntmp_table-q"createtablet_batch(nameString,create_time Date)ENGINE=HDFS('hdfs://ns:8020/data');insertintot_batch selectname,'2022-11-06'fromtmp_table"。
上面的语句中,首先通过echo语句构造了三条数据a、b和c,数据之间使用换行符( )连接,然后通过-S指定字段名为name,通过-N指定临时表为tmp_table,相当于tmp_table只有一个字段name,数据如下表1:
表1
通过-q创建基表t_batch,存储引擎为HDFS,指定了HDFS的存储路径,然后通过insert语句,将临时表tmp_table的数据插入了基表t_batch。由于Clickhouse-Local自身的机制,执行完成之后就退出,此时所有的表(tmp_table和t_batch)都会被清空,但是数据会以文件的方式存储在基表t_batch所在HDFS目录。
(2)向量化执行引擎的数据处理函数
ClickHouse-Local工具开放了源代码,在源代码的基础上,自定义数据处理函数,数据处理函数接收标准输入的数据,对每条标准输入的数据进行处理,生成数据文件,数据文件的格式为Hive等大数据平台的格式,例如ORC或者Parquet格式,无需部署和配置ClickHouse Server,非常轻量级。同时,自定义的数据处理函数,对于异常无法处理的数据,执行过滤或者使用单独的字段专门存储。
由于ClickHouse使用了向量化执行引擎,即利用CPU的SIMD(single instructionmultiple data,单条指令操作多条数据)指令集,能够执行并行的操作,对于执行相同操作的数据,一条SIMD指令可以同时处理多条数据。比如对一批数据进行字符串的截取,使用一条SIMD的指令就可以完成多条数据的字符串截取的操作,而不是每条数据都调用一次字符串截取的函数。而使用Spark或者Flink的函数,一条指令只能处理一条数据。
通过ClickHouse提供的ClickHouse-Local工具,并在该工具源码的基础之上自定义数据处理函数,具备向量化执行引擎的能力,能极大提升数据处理的效率。
自定义的数据处理函数需要具备的功能:对传入的数据进行处理,转换生成多个字段的数据,例如a,b,c,只有一个字段,如果按照逗号进行拆分,就变成了三个字符串,这三个字符串就可以对应三个字段。对于无法处理的异常数据,使用专用的字段(例如error)进行单独存储。
例如,对于JSON格式的数据,可以定义如下规则的自定义数据处理函数。自定义的数据处理函数接收待处理的JSON字符串,并传入表的字段schema与JSON字符串进行映射,输出一个元组,元组包含两个元素,第一元素是无法处理的错误字符串,第二个元素是可以正常处理的数据,正常处理的数据利用传入的schema处理之后,生成嵌套的表字段。
例如,自定义的数据处理函数的名称为parse_with_errors,传入两个参数,分别为待处理的json字段和表的字段schema。数据处理函数定义如下:
parse_with_errors(line,{schema})。
其中,line为待处理的字段名称,{schema}为schema的定义。假定schema的定义为:{"schema":[{"field":"id","type":"Int32"},{"field":"name","type":"String"},{"field":"create_time","type":"DateTime"}]}。
上面的schema定义中,通过field定义字段名称,通过type指定数据类型。
一共定义了三个字段:字段id的数据类型为Int32,字段name的数据类型为String,字段create_time的数据类型为DateTime。
数据处理函数的调用示例如下:
parse_with_errors(line,{{\"schema\":[{\"field\":\"id\",\"type\":\"Int32\"},{\"field\":\"name\",\"type\":\"String\"},{\"field\":\"create_time\",\"type\":\"DateTime\"}]}})。
line的数据示例如下表2:
表2
调用自定义的数据处理函数parse_with_errors进行处理:
/>
其中with语句的后面调用自定义的数据处理函数,返回元组t。
通过t.1获取元组的第一个元素,指定字段的别名为error,专门用于存储无法处理的异常数据,如果正常处理,当前的元素为空。
通过t.2获取元组的第二个元素,指定字段的别名为nested_field,专门用于存储处理后的嵌套字段,如果处理异常,此元素为空。
处理后的数据如下表3:
表3
其中,前面两个字段为正常处理数据,最后一个字段为异常数据,处理异常。
2、数据处理流程
Spark或者Flink读取数据,数据类型为分布式数据集,常规的数据处理流程是遍历分布式数据集的每个分区,在每个分区内部,对每条数据执行字符串的清洗、过滤和转换等一系列的数据处理操作,然后将处理后的数据写入HDFS/Hive等目标存储。数据处理主要是通过Java或者Scala代码实现的。此处,需要对数据处理流程进行优化,具体如下:
遍历分布式数据集的分区,每个分区启动一个向量化执行引擎即利用CPU的SIMD指令集来处理数据的管道,分区的每条数据,经过管道的数据处理,生成大数据平台的格式的数据文件,然后调用HDFS的API,将生成的数据文件移动至Hive表,如果Hive表存在分区,则调用分区刷新的命令,保证数据在Hive表中可见。
(1)物化视图的逻辑
每个分区的向量化执行引擎需要创建物化视图,实现对数据的处理。
创建物化视图的模板如下:
--创建物化视图
创建物化视图,指定物化视图的名称,并指定HDFS引擎基表即t_batch。
(a)物化视图的创建规则
物化视图的创建语句,在AS关键字的后面通过SQL实现数据的处理。
自定义的数据处理函数,对传入的数据进行处理,返回两列:第一列为无法处理的异常数据,第二列为正常处理数据,以嵌套类型返回。
通过where条件对数据进行过滤,例如,只想获取正常处理的数据,则限制异常数据的字段为空即可。
在select语句的后面,对嵌套字段的数据进行展开,同时对展开的嵌套字段的数据也可以使用任意的ClickHouse函数进行处理(例如字符串截取等),处理后的数据返回,存入HDFS引擎基表。
临时表temp_table的数据来源为标准输入的数据。
当数据插入临时表,物化视图会自动执行数据的处理,将处理后的数据写入HDFS引擎基表,无需手动触发。
(b)HDFS引擎基表的创建规则
基表的表引擎为HDFS,HDFS引擎可指定数据存储的HDFS路径以及文件格式(例如ORC和Parquet等)。
创建HDFS引擎基表时,字段名称和字段数据类型与物化视图的SQL逻辑返回的字段和字段数据类型保持一致。
数据存储的HDFS路径仅仅是作为临时目录,因此需要通过分区编号进行标识,例如HDFS的目录为:hdfs://ns:8020/data/{分区编号},分区编号根据所在的分区进行动态调整,例如在分区1,HDFS的目录为:hdfs://ns:8020/data/1。
示例如下:
创建物化视图:
--创建物化视图
上面创建了物化视图,物化视图的名称为view_materialized_topic,基表的表名为base_table_topic。
通过"POPULATE TO"关键字,指定了基表的名称。此处,POPULATE是可选的关键字,表示将表中的存量的数据也执行物化视图的处理。
SQL的逻辑是读取临时表temp_table的数据,临时表只有一个字段line,对line进行处理,返回的字段有id、name和create_time。
过滤条件是获取error为空的数据(通过where error is null判断),也就是只获取能够正常处理的数据。具体是否需要对error的数据进行保留或者过滤,根据具体的业务需求来定,此处作为示例,是将error的数据过滤掉了。
在创建基表时,字段名称和字段数据类型与物化视图返回的字段和字段数据类型保持一致。每个分区的建表语句不一样,在分区1,建表语句如下:
多个分区,使用相同的本地表的表名,是没有任何影响的,每个分区的数据处理逻辑相互独立。但是HDFS的路径必须不一样,因为数据是存储在HDFS上的。
上面指定了HDFS的路径为hdfs://ns:8020/data,文件格式为ORC。
其中HDFS的路径可通过查询Hive表,获取Hive表的存储路径,将Hive表的存储路径,作为HDFS的路径。
如果Hive是分区表,则在创建基表时,指定分区字段。例如,如果通过name字段分区,则指定分区字段,如下:
createtablebase_table_topic
{
idUInt32,
nameString,
create_timeDateTime
}ENGINE=HDFS('hdfs://ns:8020/data/1','ORC')
partitionbyname;
(2)分区遍历
在每个分区内部,分区的数据以迭代器的形式存在。对迭代器进行遍历,当积攒到一定的数据量,将这些数据使用换行符连接,作为标准输入的数据,传递给clickhouse-local工具。
示例如下:
echo"数据 数据 数据"||./clickhouse-local-S"line String"-Ntmp_table-q"{创建基表的语句};{创建带POPULATE关键字的物化视图的语句};"
积攒的数据量可指定为一个较大的值,例如1000,但数据量达到1000时,执行一次clickhouse-local工具的调用,调用完成之后,再对迭代器剩余的数据进行遍历调用。
上面-q后面并没有指定insertinto的数据插入语句,这是因为当数据插入至临时表tmp_table,物化视图自动完整了数据插入的操作,从而执行了数据的处理。
每执行一次clickhouse-local工具的调用,都会在HDFS的目录,生成数据文件,如下:
(a)如果建表语句未指定分区
//查看HDFS目录
#hdfsdfs-lshdfs://ns:8020/data/1
/data/1/part-xxx1.orc
/data/1/part-xxx2.orc
(2)如果建表语句指定了分区字段为name
//查看HDFS目录
#hdfsdfs-lshdfs://ns:8020/data/1
/data/1/name=aa/part-xxx1.orc
/data/1/name=bb/part-xxx2.orc
读取Hive表的元数据信息,获取Hive表的存储路径,通过HDFS的API,将HDFS的文件移动至Hive表,这一步仅仅是修改HDFS NameNode的元数据,速度非常快。如果Hive是分区表,将本次涉及的Hive分区,执行刷新的操作。例如上面的示例中,涉及Hive的分区有name=aa和name=bb,因此对这两个Hive的分区执行刷新,保证写入Hive分区的数据可以查询到数据。刷新的语句如下:
alter table hive_table add if not exists partitions(name='aa');
alter table hive_table add if not exists partitions(name='bb')。
需要说明的是,尽管在上述实施例及附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
基于同一发明构思,本发明还提出一种提升数据ETL性能的装置。该装置的实施可以参见上述方法的实施,重复之处不再赘述。以下所使用的术语“模块”,可以是实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图4是本发明提升数据ETL性能的装置结构示意图。如图4所示,该装置包括:
函数定义模块101,用于通过ClickHouse提供的Clickhouse-Local工具,并在该工具源码的基础之上自定义数据处理函数。
数据处理模块102,用于通过自定义的数据处理函数,利用CPU的SIMD指令集,对数据进行处理,生成大数据平台格式的数据文件写入目标存储,并移动至Hive表,如果Hive表存在分区,则刷新Hive表分区。
对于异常无法处理的数据,通过自定义的数据处理函数,执行过滤或者使用单独的字段专门存储。
每个分布式数据集的分区创建一条利用CPU的SIMD指令集来处理数据的管道,并在每个分区的管道中创建物化视图,并指定HDFS引擎基表;每个分布式数据集的分区中的数据以迭代器的形式存在。
物化视图的创建规则如下:
物化视图的创建语句,在AS关键字的后面通过SQL实现数据处理;
自定义的数据处理函数,对传入的数据进行处理,返回两列:第一列为无法处理的异常数据,第二列为正常处理数据,以嵌套类型返回。;
通过where条件对数据进行过滤;
在select语句的后面,对嵌套字段的数据进行展开,同时对展开的嵌套字段的数据使用任意的ClickHouse函数进行处理,处理后的数据返回,并存入HDFS引擎基表;
临时表的数据来源为标准输入的数据;
当数据插入临时表,物化视图自动执行数据处理,将处理后的数据写入HDFS引擎基表。
HDFS引擎基表的创建规则如下:
基表的表引擎为HDFS,HDFS引擎可指定数据存储的HDFS路径以及文件格式;
创建基表时,字段名称和字段数据类型与物化视图的SQL逻辑返回的字段和字段数据类型保持一致;
数据存储的HDFS路径作为临时目录,通过分区编号进行标识,分区编号根据所在的分区进行动态调整。
应当注意,尽管在上文详细描述中提及了提升数据ETL性能的装置的若干模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本发明的实施方式,上文描述的两个或更多模块的特征和功能可以在一个模块中具体化。反之,上文描述的一个模块的特征和功能可以进一步划分为由多个模块来具体化。
基于前述发明构思,如图5所示,本发明还提出一种计算机设备200,包括存储器210、处理器220及存储在存储器210上并可在处理器220上运行的计算机程序230,处理器220执行计算机程序230时实现前述提升数据ETL性能的方法。
基于前述发明构思,本发明还提出一种计算机可读存储介质,计算机可读存储介质存储有执行前述提升数据ETL性能的的计算机程序。
本发明提出的提升数据ETL性能的方法及装置,利用Spark或者Flink丰富的生态系统,接入数据源,通过向量化执行引擎,实现了高性能的数据处理;对于无法处理的数据,具备容错功能;轻量级,使用简单,无需部署Clickhouse-Server,数据处理逻辑通过clickhouse-local工具自定义的函数实现,在Spark/Flink代码中,只需要将数据通过标准输入传递给clickhouse-local工具即可完成处理。
上述涉及到的专业术语说明如下:
ETL:Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)和加载(load)至目的端的过程。
ClickHouse:一种用于数据分析的数据库名称。
Clickhouse-Local:ClickHouse提供的用于处理本地文件的工具,无需部署和配置ClickHouseServer。
ClickHouseServer:ClickHouse服务器。
HDFS:Hadoop分布式文件系统。
Hive:基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据。
OOM:英文OutofMemory的缩写,表示内存不足导致溢出。
ORC:英文OptimizedRowColumnar的缩写,ORC文件格式是一种Hadoop生态圈中的存储格式。ORC是列式存储,有着很高的压缩比。
Parquet:一个列存储格式,主要用于Hadoop生态系统,与ORC类似,有着很高的压缩比。
虽然已经参考若干具体实施方式描述了本发明的精神和原理,但是应该理解,本发明并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本发明旨在涵盖所附权利要求的精神和范围内所包含的各种修改和等同布置。
对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。