CN114385138A - 一种Flink框架运行ETL的流程联合组件方法和装置 - Google Patents

一种Flink框架运行ETL的流程联合组件方法和装置 Download PDF

Info

Publication number
CN114385138A
CN114385138A CN202111639180.4A CN202111639180A CN114385138A CN 114385138 A CN114385138 A CN 114385138A CN 202111639180 A CN202111639180 A CN 202111639180A CN 114385138 A CN114385138 A CN 114385138A
Authority
CN
China
Prior art keywords
flink
node
operator
etl
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202111639180.4A
Other languages
English (en)
Other versions
CN114385138B (zh
Inventor
高东升
梅纲
吴鑫
胡高坤
付晨玺
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Dream Database Co ltd
Original Assignee
Wuhan Dream Database Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Dream Database Co ltd filed Critical Wuhan Dream Database Co ltd
Priority to CN202111639180.4A priority Critical patent/CN114385138B/zh
Publication of CN114385138A publication Critical patent/CN114385138A/zh
Application granted granted Critical
Publication of CN114385138B publication Critical patent/CN114385138B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/25Integrating or interfacing systems involving database management systems
    • G06F16/252Integrating or interfacing systems involving database management systems between a Database Management System and a front-end application
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/25Integrating or interfacing systems involving database management systems
    • G06F16/254Extract, transform and load [ETL] procedures, e.g. ETL data flows in data warehouses
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9024Graphs; Linked lists

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Computing Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及数据处理技术领域,本发明专利提供一种Flink框架运行ETL的流程联合组件方法和装置;ETL流程组件经过拆分重组,然后翻译转换成Flink的操作算子,在Flink操作算子方法中运行重组的ETL子流程,避免重复编写Flink算子中数据处理逻辑代码,避免重复实现数据联合的逻辑代码;union组件的多个数据源可在flink框架不同的TaskManager节点分区或分片并发读取,极大提高数据读取的效率;union组件以及union组件的后续组件集合运行在Flink操作算子的方法ProcessFunction中,避免了使用Flink的union算子,从而避免了不必要的数据序列化和反序列化、网络传输,极大提高数据联合的效率。

Description

一种Flink框架运行ETL的流程联合组件方法和装置
【技术领域】
本发明涉及技术领域,特别是涉及一种Flink框架运行ETL的流程联合组件方法和装置。
【背景技术】
ETL是数据处理、构建数据仓库的一个重要工具软件,它完成异构数据源的抽取、清洗转换,然后加载的一个过程。传统的ETL一般是把流程发布到一个集中的ETL服务器节点上运行,所有的流程或流程内组件的运行采用多线程机制,再多的流程也只能在一个单一节点运行,并且一个大数据的处理流程,也无法提高数据处理的性能。
Flink大数据平台在大数据处理中已经取得相当广泛的应用,是一个分布式处理引擎框架,用于对无界和有界数据流进行有状态计算,具备极高的故障恢复性能和容错性能。
如果ETL流程能够提交到Flink框架运行,可以极大提高流程并发执行能力,并且可以充分利用流式处理的有状态计算来提高流程运行稳定可靠性。
由于Flink提交任务需要构建一个Source Stream->transform Stream->StreamSink的操作,因此,现有技术中若要将ETL流程直接在Flink的Source Stream->transformStream->Stream Sink的操作中实现,必定会涉及重新实现数据处理逻辑代码,需要破坏ETL流程的完整性。
ETL union联合组件把多个数据源数据进行联合,然后发送到下游组件。ETL联合组件可以直接翻译转换为Flink的Union算子进行上游的数据的联合。Flink联合算子虽然提供了数据联合很大的便利,但是性能效率上可能存在一定的影响。多个不同的数据源可能在不同的TaskManager进行读取的任务,根据union算子的并行度设置,union算子可能不在同一个TaskManager进行数据的联合,所以必然导致传送到union算子的子任务的数据要进行网络的传输,这些数据必定要经过数据的序列化和反序列化。所以基于Flink union算子的联合在一定场景会影响数据联合的效率。
鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。
【发明内容】
本发明要解决的技术问题是提供一种Flink框架运行ETL的流程联合组件方法。
本发明进一步要解决的技术问题是提供一种Flink框架运行ETL的流程联合组件装置。
本发明采用如下技术方案:
第一方面,一种Flink框架运行ETL的流程联合组件方法和装置,流程方法包括:
遍历ETL的有向无环图DAG,识别出一个或者多个Splitting属性的节点;其中,所述Splitting属性节点包括数据源节点、FLINK_MESSAGE_SHARED_NODE属性的节点与需要转化为Flink算子的节点中的一个或者多个;
按照ETL流程DAG有向无环图节点先后顺序,从数据源节点开始,以相邻的两个所述Splitting属性的节点作为依据,生成由相邻的两个所述Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成的ETL流程子集,在Flink算子中使用;构造所述两个相邻Splitting属性的节点之间所对应的flink API语句操作算子链;
Union联合组件将至少两个所述数据源节点数据进行联合,所述数据源节点在Flink框架的TaskManager节点分区或者分片并发读取;
当所述union联合组件的下游存在需要转化为Flink算子的节点时,所述union联合组件转换为Flink的union算子;当所述union联合组件的下游不存在需要转化为Flink算子的节点时,所述union联合组件不转换为Flink的union算子;对应构造各个数据联合的flink API语句操作算子链;配置ETL union组件输出基准列,所述数据联合转换的逻辑由flink算子中运行的所述各个ETL流程子集处理。
优选的,所述配置ETL union组件输出基准列,所述数据联合转换的逻辑由flink算子中运行的所述各个ETL流程子集处理,具体包括:
配置ETL union组件输出基准列,定义其中一个数据源列信息为基准列信息,定义除开基准列以外的数据源列信息为非基准列信息,所述非基准列信息按照基准列信息进行匹配;所述非基准列数据在ETL流程中处理。
优选的,当union联合组件的下游子集存在所述需要转化为Flink算子的节点时,则所述union联合组件转化为Flink的union算子,设置所述union联合组件节点属性FLINK_UNION_NODE为true;
当union联合组件的下游子集不存在所述Flink算子的节点时,则所述union联合组件不转化为Flink的union算子,设置所述union联合组件节点属性FLINK_UNION_NODE为false。
优选的,所述union联合组件节点属性FLINK_UNION_NODE设置为true时,所述union联合组件上游的Splitting属性的节点后续直至所述union联合组件构成ETL流程子集,所述ETL流程子集封装在上一个ETL流程子集中的Splitting属性的节点对应的算子的后续的flink的transform算子或者flatMap算子的ProcessFunction中运行,所述transform算子或者flatMap算子的输出作为Flink union算子的输入;union算子的输出作为union节点后续算子的输入。
优选的,所述union联合组件节点属性FLINK_UNION_NODE设置为false时,所述union联合组件上游的Splitting属性的节点后续所有组件构成的组件构成ETL流程子集,所述ETL流程子集封装在上一个ETL流程子集中的Splitting属性的节点对应的算子的后续的flink的transform算子或者flatMap算子的ProcessFunction中运行,所述ProcessFunction中运行的ETL流程子集中的union节点只有一个输入。
优选的,合并运行于Flink算子的子任务Function内的子流程的统计信息,获取ETL流程中所有组件的统计信息。
优选的,所述的需要转化为Flink算子的节点具体包括FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点;
搜索出ETL流程中所有的需要转化为Flink算子的节点,所述节点的上游一直到数据源节点的路由线设置为FLINK_MESSAGE_SHARED_ROUTER属性。
优选的,数据源节点开始,如果节点存在至少两个分支路由线,并且有至少两个分支路由线被设置为FLINK_MESSAGE_SHARED_ROUTER属性,则所述节点为FLINK_MESSAGE_SHARED_NODE属性的节点,设置FLINK_MESSAGE_SHARED_NODE属性;
其中需要转化为Flink算子的节点不设置为FLINK_MESSAGE_SHARED_NODE节点。
优选的,遍历ETL的有向无环图DAG,识别出数据源节点、FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点,并根据所述FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点识别出所有FLINK_MESSAGE_SHARED_NODE属性的节点,将所述数据源节点、FLINK_REDUCE_NODE属性的节点、FLINK_CONNECTOR_NODE属性的节点与FLINK_MESSAGE_SHARED_NODE属性的节点设置为Splitting属性的节点;以相邻的两个所述Splitting属性的节点作为依据,生成由相邻的两个所述Splitting属性的节点之间的一个或者多个ETL节点构成的子集。
第二方面,一种Flink框架运行ETL的流程联合组件装置,所述Flink框架运行ETL的流程分解装置包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行所述的Flink框架运行ETL的流程联合组件方法。
本发明专利提供一种Flink框架运行ETL的流程联合组件方法;ETL流程组件经过拆分重组,然后翻译转换成Flink的操作算子,在Flink操作算子方法中运行重组的ETL子流程,避免重复编写Flink算子中数据处理逻辑代码,避免重复实现数据联合的逻辑代码;union组件的多个数据源可在flink框架不同的TaskManager节点分区或分片并发读取,极大提高数据读取的效率;union组件以及union组件的后续组件集合运行在Flink操作算子的方法ProcessFunction中,避免了使用Flink的union算子,从而避免了不必要的数据序列化和反序列化、网络传输,极大提高数据联合的效率。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的流程示意图;
图2是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的流程示意图;
图3是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的在Flink框架下运行的DAG转换图;
图4是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的在Flink框架下运行的DAG转换图;
图5是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的ETL流程的DAG示意图;
图6是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的在Flink框架下运行的DAG示意图;
图7是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的在Flink框架下运行的DAG示意图;
图8是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的在Flink框架下运行的DAG示意图;
图9是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的在Flink框架下运行的DAG示意图;
图10是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的在Flink框架下运行的DAG示意图;
图11是本发明实施例提供的一种Flink框架运行ETL的流程联合组件方法的在Flink框架下运行的DAG示意图;
图12是本发明实施例提供的一种Flink框架运行ETL的流程联合组件装置的装置示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
本发明实施例1提供了一种Flink框架运行ETL的流程联合组件方法。
一种Flink框架运行ETL的流程联合组件方法,方法包括:
遍历ETL的有向无环图DAG,识别出一个或者多个Splitting属性的节点;其中,所述Splitting属性节点包括数据源节点、FLINK_MESSAGE_SHARED_NODE属性的节点与需要转化为Flink算子的节点中的一个或者多个;
按照ETL流程DAG有向无环图节点先后顺序,从数据源节点开始,以相邻的两个所述Splitting属性的节点作为依据,生成由相邻的两个所述Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成的ETL流程子集,在Flink算子中使用;构造所述两个相邻Splitting属性的节点之间所对应的flink API语句操作算子链;
ETL流程中数据源节点为流程的起始节点,存在一个输出,没有输入,使用flink的SourceFunction生成数据供后续算子作为输入使用,其中所述数据包括DataSet或DataStream,也就是数据集或数据流;
ETL流程中的消息分享节点为定义为FLINK_MESSAGE_SHARED_NODE属性的节点,所述节点转换为flink API操作算子时存在一个输入与一个输出,所述消息分享节点的后续节点存在至少两个节点需要转化为flink算子;
ETL流程中的缩减节点为定义为FLINK_REDUCE_NODE属性的节点,所述节点转换为flink API操作算子时存在一个或者多个输入与一个输出;
ETL流程中的连接节点为定义为FLINK_CONNECTOR_NODE属性的节点,所述节点转换为flink API操作算子时存在一个输入,所述节点运行处理数据后直接进行装载;
所述消息分享节点、连接节点和缩减节点都是接收上一个节点的输出数据后,生成一个新的输出数据,输出给后续算子。
由于在以Flink框架运行ETL流程的方法中,需要根据ETL组件节点集合构造FlinkAPI语句,而一条Flink API语句使用一个或多个输入,一个输出,需要将两个FLINK_SPLITTING_NODE之间组件集合运行在Flink算子里面,因此存在以下优选方案:
将所述数据源节点、FLINK_MESSAGE_SHARED_NODE属性的节点与Flink算子的节点均定义为FLINK_SPLITTING_NODE属性的节点。
根据相邻的Splitting属性的节点之间的ETL节点集合,构造Flink API语句,优选的:
以相邻的所述Splitting属性的节点作为依据,生成由相邻的所述Splitting属性的节点之间的一个或者多个ETL节点构成的子集,并通过一个Flink算子运行相应子集;
从数据源节点开始每一个分支搜索下一个Splitting属性的节点,如果所述Splitting属性的节点为空,则从上一轮搜索开始中间搜索到的所有节点以及节点之间的路由线构成组成一个集合,将所述集合在一个Flink算子ProcessFunction中运行;如果所述搜索到的Splitting属性的节点不为空,则从上一轮搜索开始中间搜索到的所有节点以及节点之间的路由线构成组成一个集合,将所述集合在一个Flink算子ProcessFunction中运行,然后作为SplittingNode算子的输入。
Union联合组件把至少两个数据源数据进行联合,发送到下游组件,其中Flink的union算子能够为所述数据源数据的联合提供便利,数据源分片后的多个子任务的并发读取,极大提高了数据读取效率;
如图1所示,flink框架运行ETL的流程联合组件流程如下:
步骤101中,Union联合组件将至少两个所述数据源节点数据进行联合,所述数据源节点在Flink框架的TaskManager节点分区或者分片并发读取;
将union联合组件的至少两个数据源在Flink框架的不同TaskManager节点分区或者分片并发读取,极大的提高数据读取的效率,但多个不同的数据源可能在不同的TaskManager进行读取任务,根据Flink的union算子的并行度设置,Flink的union算子可能不在同一个TaskManager进行数据的联合,导致传送到union算子的子任务的数据需要进行网络传输,所述union算子的子任务的数据需要经过数据的序列化和反序列化,因此将union联合组件转化为Flink的union算子在上述场景会影响数据联合的效率。
步骤102中,判断union联合组件下游是否存在Flink算子的节点,若存在,跳转至步骤103,若不存在,跳转至步骤105;
步骤103中,当所述union联合组件的下游存在需要转化为Flink算子的节点时,设置所述union联合组件节点属性FLINK_UNION_NODE为true;
步骤104中,所述union联合组件转换为Flink的union算子;
步骤105中,设置所述union联合组件节点属性FLINK_UNION_NODE为false;步骤106中,当所述union联合组件的下游不存在需要转化为Flink算子的节点时,所述union联合组件不转换为Flink的union算子;对应构造各个数据联合的flink API语句操作算子链;
配置ETL union组件输出基准列,所述数据联合转换的逻辑由flink算子中运行的所述各个ETL流程子集处理。
union联合组件以及union联合组件的后续组件集合运行在Flink操作算子的方法ProcessFunction中,避免了使用Flink的union算子,从而避免了不必要的数据序列化和反序列化、网络传输,极大提高数据联合的效率。
由于ETL union组件对应的多个数据源的数据列信息不一定完全一致,可能存在列数的不一致与列的类型的不一致,因此存在以下优选方法:
配置ETL union组件输出基准列,定义其中一个数据源列信息为基准列信息,定义除开基准列以外的数据源列信息为非基准列信息,所述非基准列信息按照基准列信息进行匹配;所述非基准列数据在ETL流程中处理。
由于所述非基准列信息按照基准列信息进行匹配并在ETL流程中处理,因此不用重复实现数据联合转换的逻辑代码。
其中,无论union组件的节点属性FLINK_UNION_NODE为false还是true,所述非基准列数据都在ETL流程中处理;
其中所述Flink算子的节点包括设置为FLINK_REDUCE_NODE属性的节点与设置为FLINK_CONNECTOR_NODE属性的节点;所述设置为FLINK_REDUCE_NODE属性的节点包括排序组件、连接组件、聚合组件、增量比对组件之类的需要将接收到的数据进行缓存后计算处理的组件;所述设置为FLINK_CONNECTOR_NODE属性的节点包括不限于kafka装载组件。
所述union联合组件节点属性FLINK_UNION_NODE设置为true时,所述union联合组件上游的Splitting属性的节点后续直至所述union联合组件构成ETL流程子集,所述ETL流程子集封装在上一个ETL流程子集中的Splitting属性的节点对应的算子的后续的flink的transform算子或者flatMap算子的ProcessFunction中运行,所述transform算子或者flatMap算子的输出作为Flink union算子的输入;union算子的输出作为union节点后续算子的输入。所述union联合组件节点属性FLINK_UNION_NODE设置为false时,所述union联合组件上游的Splitting属性的节点后续所有组件构成的组件构成ETL流程子集,所述ETL流程子集封装在上一个ETL流程子集中的Splitting属性的节点对应的算子的后续的flink的transform算子或者flatMap算子的ProcessFunction中运行,所述ProcessFunction中运行的ETL流程子集中的union节点只有一个输入。
所述数据源节点到后续所有组件的运行链接成一个task,所述task多个子任务在不同的TaskManager并发运行,避免了数据的网络传输以及数据的序列化和反序列化。
ETL流程提交到Flink框架执行,ETL流程被分解为至少一个子集运行在flink的操作算子里面,当仅通过flink操作算子提供的算子统计信息,无法捕捉到流程的每个组件运行的统计信息,因此还存在以下优选方法:
合并运行于Flink算子的子任务Function内的子流程的统计信息,获取ETL流程中所有组件的统计信息。
Union联合组件的统计信息不从Flink的union算子子任务获取统计信息,获取ProcessFunion子任务中union联合组件组件的运行统计信息,并进行合并处理。
由于需要遍历ETL的有向无环图DAG,确定出一个或者多个Splitting属性的节点,但所述识别Splitting属性的节点的流程中,仅能识别出Flink的算子的节点,而所述FLINK_MESSAGE_SHARED_NODE属性的节点并非Flink算子的节点,因此需要设置出FLINK_MESSAGE_SHARED_NODE属性的节点,存在以下优选方法:
如图2所示,Flink框架运行ETL的流程分解流程如下:
步骤201中,遍历ETL的DAG,识别出数据源节点与Flink算子的节点;
步骤202中,所述识别出来的Flink算子的节点的上游一直到数据源节点的路由线设置为FLINK_MESSAGE_SHARED_ROUTER属性;
所述Flink算子的节点具体包括FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点
步骤203中,数据源节点开始,如果存在节点存在至少两个分支路由线,并且有至少两个分支路由线被设置为FLINK_MESSAGE_SHARED_ROUTER属性,则所述节点为FLINK_MESSAGE_SHARED_NODE属性的节点,设置FLINK_MESSAGE_SHARED_NODE属性。
步骤204中,将数据源节点、Flink算子的节点以及FLINK MESSAGE SHARED NODE属性的节点定义为Splitting属性的节点;
步骤205中,识别出所有FLINK_MESSAGE_SHARED_NODE属性的节点,则确定出ETL的有向无环图DAG中所有Splitting属性的节点,以相邻的所述Splitting属性的节点作为依据,生成由相邻的所述Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成的ETL流程子集,所述ETL流程子集在Flink算子中使用。
所述Flink算子被调用时,构造所述ETL流程子集的DAG并运行;所述相邻Splitting属性的节点之间构造一条flink API操作算子链,所述相邻Splitting属性的节点中的前一个Splitting属性的节点对应的flink算子的输出数据流或数据集作为所述flink API操作算子链的输入,所述flink API操作算子链的输入后续构造一个使用所述ETL流程子集的Flink算子。
其中所述Flink算子为flatMap算子或者transform算子。
当所述相邻Splitting属性的节点中的后一个Splitting属性的节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,所述后一个Splitting属性的节点不转化为对应的Flink算子;
当所述相邻Splitting属性的节点中的后一个Splitting属性的节点不为FLINK_MESSAGE_SHARED_NODE属性的节点时,所述后一个Splitting属性的节点需要转化为对应的flink算子,所述flink算子输入为两个相邻Splitting属性的节点之间ETL流程子集的Flink算子的输出。
其中所述与Splitting属性的节点对应的flink算子为:kafka装载节点对应kafkasink算子;排序组件对应flink的SortPartitionOperator算子;连接组件与增量比对组件对应flink的CoGroupOperator算子;聚合组件对应flink的GroupReduceOpetator算子;上述flink算子的输入为使用ETL流程子集的flatMap算子或transform算子的输出。
步骤206中,在生成所述子集过程中,为每一个所述子集分别构建TYPE_FLINK_PROCESS_SOURCE节点用于接收上一个Flink算子输出的数据集或者数据流,以及TYPE_FLINK_PROCESS_SINK节点用于将作为子集的自己输出的数据集或者数据流传递给下一个子集或者ETL输出节点;从而将ETL的处理过程承载到Flink框架中完成。
所述FLINK_REDUCE_NODE属性的节点对上游接收的数据进行缓存,然后进行数据处理,输出结果;而ETL流程中非REDUCE节点对接收的仅一条数据进行计算处理,然后对下游输出处理后的数据;
所述FLINK_CONNECTOR_NODE属性的节点使用Flink提供的connector,已封装完善了数据的读取与装载;
由于所述Flink算子存在输出为数据集或者数据流两种情况,因此,本发明还存在以下优选设计:
在所述Flink算子输出的是数据集时,相应ETL流程子集在flatMap算子的函数ETLDataSetProcessFunction中处理,所述方法还包括:
所述ETLDataSetProcessFunction派生于Flink的RichFlatMapFunction;重定义RichFlatMapFunction的flatMap函数功能,所述RichFlatMapFunction接收一条数据消息message后,直接通过消息队列存取的方式发送给所述ETLDataSetProcessFunction在open函数初始化并启动的ETL流程子集运行中的数据源节点TYPE_FLINK_PROCESS_SOURCE组件,然后由ETL流程子集进行计算处理,由所述ETL流程子集的TYPE_FLINK_PROCESS_SINK组件调用collector函数发送给下一个flink算子;
其中,所述数据消息message为ETL组件之间传递的数据封装对象。
优选的,所述数据集对象为数据源节点TYPE_FLINK_PROCESS_SOURCE与数据源节点TYPE_FLINK_PROCESS_SINK,所述数据源节点TYPE_FLINK_PROCESS_SOURCE接收上一个子集的输出数据集,所述数据源节点TYPE_FLINK_PROCESS_SINK将经过转换生成的数据发送给下一个子集;其中,所述子集在flink的flatMap算子的RichFlatMapFunction代码中使用,所述RichFlatMapFunction代码的定义由本领域技术人员自行设计。
在所述Flink算子输出的是数据流类型,所述ETL流程子集在transform算子的ETLProcessFunction中处理,方法具体包括:
所述ETLProcessFunction派生于Flink的ProcessFunction;重定义ProcessFunction的processElement函数功能,所述ProcessFunction接收一条数据消息message后,直接通过消息队列存取的方式发送给所述ETLProcessFunction在open函数初始化并启动的ETL流程子集运行中的数据源节点TYPE_FLINK_PROCESS_SOURCE组件,然后由ETL流程子集进行计算处理,由所述ETL流程子集的TYPE_FLINK_PROCESS_SINK组件调用collector函数发送给下一个flink算子;
其中,所述数据消息message为ETL组件之间传递的数据封装对象。
原本flink提供的ProcessFunction是通过processElement函数接受一个消息数据message,然后经过计算处理,通过参数collector发送给下一个算子;本方法中所述ProcessFunction仅仅接收一条数据消息message,然后直接通过消息队列存取的方式发送给该ETLProcessFunction在open初始化启动的ETL子流程运行中的数据源节点TYPE_FLINK_PROCESS_SOURCE,由所述ETL子流程进行计算处理,所述子流程的TYPE_FLINK_PROCESS_SINK节点调用collector发送给下一个子集的算子。
由于需要生成由相邻的所述Splitting属性的节点之间的一个或者多个ETL节点构成的子集,但在ETL的有向无环图DAG中遍历找到一个Splitting属性的节点,存在所述Splitting属性的节点之后仅包含非Splitting属性的节点的情况,因此还存在以下优选方法:
位于所述Splitting属性的节点后的非Splitting属性的节点构成的一个子集;其中,所述子集无后续Splitting属性的节点,不用输出数据集或者数据流供后续Flink算子使用;
为所述子集构造一个TYPE_FLINK_PROCESS_SOURCE节点接收上一个算子的输出数据,对于所述子集不构造TYPE_FLINK_PROCESS_SINK节点。
所述找到的Splitting属性的节点后续无splittingNode时,后续所有节点以及节点之间的路由线构成的一个组件子集,由于无后续splittingNode,不用输出数据集供后续算子使用,所以这个子集只需构造一个数据源节点TYPE_FLINK_PROCESS_SOURCE接收上一个算子的输出数据集,同样,所述子集在flink的flatMap算子的RichFlatMapFunction代码使用;其中,所述RichFlatMapFunction代码的定义由本领域技术人员自行设计。
对于子集构造一个数据源节点TYPE_FLINK_PROCESS_SOURCE接收上一个算子的输出数据集,对于所述子集不构造TYPE_FLINK_PROCESS_SINK节点情况,相应的Flink架构采用API算子ETLDataSetProcessFunction运行,则方法具体包括:
在Flink中RichFlatMapFunction基础上衍生ETLDataSetProcessFunction函数,所述ETLDataSetProcessFunction函数调用flatMap函数,所述flatMap函数仅仅接收一条数据消息message后,直接通过消息队列存取的方式发送给所述ETLDataSetProcessFunction在open初始化启动的ETL子集流程运行中的数据源节点TYPE_FLINK_PROCESS_SOURCE组件后,由ETL子集流程进行计算处理,由该子流程的TYPE_FLINK_PROCESS_SINK组件调用collector发送给下一个子集;
其中,所述数据消息message为输出数据集在数据流传输模式下的输出给下一子集的数据形式。
原本flink提供的RichFlatMapFunction是通过flatMap算子接受一个消息数据message,然后经过计算处理,通过参数collector发送给下一个子集的算子;而在本方法中所述flatMap算子只接收一条数据消息message,通过消息队列存取的方式发送给所述Function在open初始化启动的ETL子流程运行中的数据源节点TYPE_FLINK_PROCESS_SOURCE组件,由ETL子流程进行计算处理,由所述子流程的TYPE_FLINK_PROCESS_SINK组件调用collector发送给下一个算子;所述flatMap算子的ETLDataSetProcessFunction实现flink的RichFlatMapFunction接口,具体如下:
Figure BDA0003442251520000101
实施例2:
本发明实施例2提供了一种Flink框架运行ETL的流程联合组件方法,本实施例2相比实施例1在更加实际的场景下来展现使用Flink联合算子的实施流程。
ETL流程图中union联合组件下游后续子集中存在排序组件,因为排序组件为FLINK_REDUCE_NODE属性的节点,所以排序节点为Flink算子的节点,union联合组件需要转化为flink的union算子。
Union联合组件对应的多个数据源的数据列信息不一定完全一致,存在列数不一致与列的类型不一致的情况;ETL配置union组件输出基准列,以其中一个数据源列信息为基准,其它数据源数据按照所述数据源列信息基准进行匹配与转换;非基准列的数据源的数据匹配与转换均在在ETL流程内部处理,不用重复实现联合数据匹配与转换的逻辑代码;数据源组件后续直至union组件并且包括union组件构成的组件集合封装在Source算子后续的ProcessFunction算子中运行,ProcessFunction算子的输出作为Flink union算子的一个输入,union算子的输出作为后续算子的输入。
将union组件的数据源拆分为一个或多个分片split,供source算子多任务并发读取,提高数据读取效率。
如图3所示,ETL流程图翻译转化为flink API语句;
其中,数据源1和数据源2在各自的自定义SourceInputFormat中并发读取;unionFunction1与unionFunction1构造一个ETL子流程异步运行,进行联合数据的匹配与转换;所述子流程组件集合UnionCollection由消息队列messageQueue接收数据Message的类型为TYPE_FLINK_PROCESS_SOURCE的组件、类型为union的组件、类型为TYPE_FLINK_PROCESS_SINK的MessageCollector组件构成,具体如下:
ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();
DataSet source1DataSet=env.createInput(new SourceInputFormat(source1));
source1DataSet.setParallelism(parallelism);
ETLDataSetProcessFunction unionFunction1=newETLDataSetProcessFunction(UnionCollection1);
DataStrean union1DataSet=source1DataSet.flatMap(function1).setParallelism(parallelism).returns(messageTypeInfo);
DataSet source2DataSet=env.createInput(new SourceInputFormat(source2));
Source2DataSet.setParallelism(parallelism);
ETLDataSetProcessFunction UnionFunction2=newETLDataSetProcessFunction(UnionCollection2);
DataStrean union2DataSet=source2DataSet.flatMap(function2).setParallelism(parallelism).returns(messageTypeInfo);
DataSet<Message>unionDataSet=union1DataSet.union(union2DataSet);
DataSet sortDataSet=new SortPartitionOperator(unionDataSet,newSelectorFunctionKeys(sort));
ETLDataSetProcessFunction functionSink=new ETLDataSetProcessFunction(TransformSinkCollection);
sortDataSet.flatMap(functionSink).returns(messageTypeInfo).;
上述flatMap算子的ETLDataSetProcessFunction实现flink的RichFlatMapFunction接口,描述如下:
Figure BDA0003442251520000121
原本flink提供的RichFlatMapFunction通过flatMap接受一个消息数据message,经过计算处理后,通过参数collector发送给下一个算子;本发明专利实现的flatMap函数仅接收一条数据消息message,并推送到消息队列messageQueue中且不做转换计算处理。
在open函数内部构造组件集合TransformCollection的DAG有向无环图FlinkFuncDAG,并异步启动FlinkFuncDAG运行;所述流程中数据源节点类型为TYPE_FLINK_PROCESS_SOURCE的ProcessSource组件从消息队列messageQueue接收数据Message,并发送给下游组件,ETL子流程内部进行一系列的转换计算处理;当FlinkFuncDAG存在类型为TYPE_FLINK_PROCESS_SINK的MessageCollector组件,则所述MessageCollector组件从上游组件接收数据,然后调用collector发送消息Message给下一个算子。
实施例3:
本发明实施例3提供了一种Flink框架运行ETL的流程联合组件方法,本实施例3相比实施例1在更加实际的场景下来展现本方案的不使用fink联合算子的运行实施流程。
ETL流程图中联合组件下游后续组件不存在需要翻译转化为flink算子的组件,union联合组件这时不需要转化为flink框架提供的union操作算子。
其中,ETL union组件对应的多个数据源的数据列信息不一定完全一致,可能存在列数的不一致与列的类型的不一致;ETL配置union组件输出基准列,以其中一个数据源列信息作为基准,其它数据源数据按照基准列信息进行匹配与转换;非基准列的数据源的数据匹配与转换均在在ETL流程内部处理,不用重复实现联合数据匹配与转换的逻辑代码。
数据源组件后续所有组件构成的集合封装在SourceFunction后续的ProcessFunction算子中运行,其中每个所述ProcessFunction算子中运行的ETL子流程中的union节点只有一个输入;Source算子的后续算子设置与Source算子相同的并行度parallelism;避免了Flinkunion算子的使用,从数据源读取组件到后续所有组件的运行可以链接成一个task,所述task多个子任务并发运行在不同的TaskManager,避免了数据的网络传输以及数据的序列化和反序列化。
其中,将union组件的数据源拆分为一个或多个分片split,供source算子多任务并发读取,提高数据读取效率。
如图4所示,图中ETL流程图翻译转化为下面flink API语句,如下:
数据源1和数据源2在各自的自定义SourceInputFormat中并发读取;unionFunction1与unionFunction1构造一个ETL子流程异步运行,进行联合数据的匹配、转换以及后续的装载;所述子流程组件集合UnionTransformCollection由从消息队列messageQueue接收数据Message的类型为TYPE_FLINK_PROCESS_SOURCE的组件、类型为union的组件与数据装载组件;具体如下:
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
DataStream source1Stream=env.addSource(new CustomSourceFunction(source1));
source1Stream.setParallelism(parallelism);
ETLProcessFunction unionFunction1=new ETLProcessFunction(UnionTransformCollection1);
ProcessOperator operator=new ProcessOperator(unionFunction1);
source1Stream.transform(“Process”,messageTypeInfo,operator).setParallelism(parallelism);
DataStream source2Stream=env.addSource(new CustomSourceFunction(source2));
source2Stream.setParallelism(parallelism);
ETLProcessFunction unionFunction2=new ETLProcessFunction(UnionTransformCollection2);
ProcessOperator operator=new ProcessOperator(unionFunction2);
Source2Stream.transform(“Process”,messageTypeInfo,operator).setParallelism(parallelism);
上述transform算子的ETLProcessFunction实现flink ProcessFunction接口,描述如下:
Figure BDA0003442251520000141
原本flink提供的ProcessFunction通过processElement接受一个消息数据message,经过计算处理,通过参数collector发送给下一个算子;本发明专利实现Flink框架ProcessFunction的processElement函数中,仅接收一条数据消息message,将所述消息推送给消息队列messageQueue;ETLProcessFunction在open函数内部构造组件集合TransformCollection的DAG有向无环图FlinkFuncDAG,并异步启动FlinkFuncDAG运行;流程中数据源节点类型为TYPE_FLINK_PROCESS_SOURCE的ProcessSource组件从消息队列messageQueue接收数据Message,发送给下游组件,ETL子流程内部进行一系列的转换计算处理;当FlinkFuncDAG存在类型为TYPE_FLINK_PROCESS_SINK的MessageCollector组件,则所述组件从上游组件接收数据,然后调用collector发送消息Message给下一个算子。
实施例4:
本发明实施例4提供了一种Flink框架运行ETL的流程联合组件方法,本实施例4相比实施例1在更加实际的场景下来展现本方案流程监控的实施流程。
ETL流程提交到Flink框架执行,所述ETL流程被分解为子流程运行在flink的操作算子中;仅通过flink操作算子提供的算子统计信息,无法捕捉到流程的每个组件运行的统计信息,通过合并运行于算子子任务Function内的子流程的统计信息,获取流程中每个组件的运行统计信息;联合组件的统计信息不从Flink union算子子任务获取,直接获取ProcessFunion子任务中运行的ETL子流程中union组件运行的统计信息,并进行合并处理。
如图4所示,ETL流程翻译转化为flink API语句提交后,通过设置相应的并行读,数据源1的读取在多个个子任务中并发读取;数据源2的读取在多个个子任务中并发读取,联合组件以及装载组件构成的ETL子流程也在多个子任务中并发运行,所述子任务运行在flink同一个或多个不同的TaskManager中;具体监控方式如下:
ETL流程运行所在的flink TaskManager部署一个RPC服务,所述服务定义方法获取本地ETL流程的运行统计信息。
监控端部署RPC服务,以便ETL子流程运行任务发送通知信息;
当ETL流程运行于flink的SourceFunction、ProcessFunction时,通知监控端ETL流程改变子任务运行的flink TaskManager服务信息、包括地址和端口。
监控端定期访问ETL流程运行所在的flink TaskManager部署的服务,以收集各个所述子任务的运行统计信息并进行合并。
实施例5:
本发明实施例5提供了一种Flink框架运行ETL的流程联合组件方法,本实施例5相比实施例1在更加实际的场景下来展现本方案流程监控的实施流程。
如图5所示,为ETL流程不在Flink框架中的运行流程,本实施例中ETL流程存在一个数据源节点、三个转换节点与两个转载节点。
其中ETL流程里面的节点以及节点之间的路由线构造DAG有向无环图;
数据源节点读取数据并发送到后续转换节点1;
转换节点1读取数据并运行完成后发送给后续转换节点2与转换节点3;
转换节点2与转换节点3读取数据并运行完成后分别发送给转载节点1与转载节点2;
转载节点1与转载节点2对接收到的数据完成装载,流程运行完毕。
如图6所示,流程提交到FLINK执行,需要构造Flink操作算子链,Flink操作算子为:
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
DataStream transform1DataStream=env.addSource(source).process(Transform1);
transform1DataStream.Process(Transform2).addSink(sink1);
transform1DataStream.Process(Transform3).addSink(sink2);
env.execute();
source算子执行该source的SourceFunction,读取数据以数据流的形式发送到后续算子。
Transform1、Transform2、Transform3各自接收到对应数据后,Transform1、Transform2、Transform3的ProcessFunction执行各自的数据转换,生成新的数据流发送到后续节点;
其中,Transform1生成的数据流作为Transform2、Transform3数据流源头共享使用。
Transform2与Transform3生成的数据流发送到后续的sink算子,装载写入相应的目的。
实施例6:
本发明实施例6提供了一种Flink框架运行ETL的流程联合组件方法,本实施例6相比实施例1在更加实际的场景下来展现本方案流程监控的实施流程。
如图7所示,本发明实施例是在只有一个数据源节点、无FLINK_REDUCE_NODE属性的节点、无FLINK_CONNECTOR_NODE属性的节点的情况下的ETL流程分解,由于本流程中无FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点,因此无FLINK_MESSAGE_SHARED_NODE属性的节点。
Source算子执行所述Source的SourceFunction,读取数据以数据流的形式发送到后续算子。
Transform1接收到对应数据后,Transform1的ProcessFunction执行数据转换,生成新的数据流发送给后续节点;
Transform1生成的数据流发送到后续的sink算子,装载写入相应的目的。
生成算子语句如下:
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource(SourceFunction).process(ProcessFunction);
数据源独立在SourceFunction中运行,数据源后续所有的节点都在ProcessFunction运行,其中算子API不存在sink。
实施例7:
本发明实施例7提供了一种Flink框架运行ETL的流程联合组件方法,本实施例7相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图8所示,本发明实施例是在同时存在FLINK_REDUCE_NODE属性的节点节点、FLINK_MESSAGE_SHARED_NODE属性的节点节点的情况下的ETL流程分解。
其中,Sort1与Sort2节点为FLINK_REDUCE_NODE节点;Transform2为FLINK_MESSAGE_SHARED_NODE节点。
Source算子执行所述Source的SourceFunction,读取数据以数据流的形式发送到后续算子。
Transform1与Transform2各自接收到对应数据后,Transform1与Transform2的ProcessFunction执行各自的数据转换,生成新的数据流发送到后续节点;
Sort1与Sort2各自接收到对应数据后,Sort1与Sort2的SortFunction执行各自的数据转换,生成新的数据流发送到后续节点;
Sort1与Sort2生成的数据流发送到后续的Sink1与Sink2的算子,装载写入相应的目的。
Sort1与Sort2生成的数据流发送到后续的sink1与Sink2的算子,装载写入相应的目的。
实施例8:
本发明实施例8提供了一种Flink框架运行ETL的流程联合组件方法,本实施例8相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图9所示,本发明实施例是在同时存在FLINK_CONNECTOR_NODE节点、FLINK_MESSAGE_SHARED_NODE节点的情况下的ETL流程分解。
其中Kafka Sink1、Kafka Sink2与Table Sink2为FLINK_CONNECTOR_NODE;Transform1是FLINK_MESSAGE_SHARED_NODE节点。
Source算子执行所述Source的SourceFunction,读取数据以数据流的形式发送到后续算子。
Transform1、Transform2、Transform3与Transform4各自接收到对应数据后,Transform1、Transform2、Transform3与Transform4的ProcessFunction执行各自对应的数据转换,生成新的数据流发送到后续节点;
其中,Transform1生成的数据流作为Transform2、Transform3与Transform4数据流源头共享使用。
Transform2、Transform3与Transform4生成的数据流发送到后续的sink算子,Kafka Sink1、Kafka Sink2与Table Sink2对应的算子装载写入相应的目的。
生成算子语句如下:
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
DataStream transform1DataStream=env.addSource(KafkaSourceFunction).process(ProcessFunction1);
transform1DataStream.Process(ProcessFunction2).addSink(Kafka sink1);
transform1DataStream.Process(ProcessFunction3).addSink(Kafka sink2);
其中,ProcessFunction1、ProcessFunction2与ProcessFunction3具体如下:
ProcessFunction1由Transform1构造DAG来运行;
ProcessFunction2由Transform2构造DAG来运行;
ProcessFunction3由Transform3、Transform4、table Sink2以及它们的路由线构造DAG来运行;
实施例9:
本发明实施例9提供了一种Flink框架运行ETL的流程联合组件方法,本实施例9相比实施例1为在Flink算子输出的是数据集具体的情景来展现本方案的实施流程。
如图10所示,其中,Table source为数据源节点;Transform3为FLINK_MESSAGE_SHARED_NODE节点;Flie Sink1与Flie Sink2为FLINK_CONNECTOR_NODE节点。
Table Source算子执行所述Source的SourceFunction,读取数据以数据流的形式发送到后续算子。
Transform1、Transform2、Transform3、Transform4、Transform5、Transform6与Transform7各自接收到对应数据后,Transform1、Transform2、Transform3、Transform4、Transform5、Transform6与Transform7的ProcessFunction执行各自的数据转换,生成新的数据流发送到后续节点;
其中,Transform3生成的数据流作为Transform4与Transform6数据流源头共享使用。
Sort1与Sort2生成的数据流发送到后续的Flie Sink1与Flie Sink2的Sink算子,装载写入相应的目的。
Table Source与Transform3之间的组件子集为Transform1、Transform2、Transform3以及它们之间的路由线;所述子集运行的ETL子流程必须从Table source算子的输出数据集接收数据,经过Transform3转换后,输出数据集供后续算子使用;所述子集构造一个数据集对象TYPE_FLINK_PROCESS_SOURCE接收上一个算子的输出数据集,以及一个数据集对象TYPE_FLINK_PROCESS_SINK发送数据到下一个算子;所述子集在Flink的FlatMap算子的RichFlatMapFunction代码使用,定义为TransformCollection1-2-3,完成Table Source与Transform3之间的组件翻译转化。
Transform3与Sort1之间的组件集合为Transform4、Transform5以及Transform3与sort1之间的组件的路由线;所述子集运行的ETL子流程从上一个算子接收数据,经过Transform5转换后,输出数据集供后续算子Sort1使用。所述子集构造一个数据集对象TYPE_FLINK_PROCESS_SOURCE接收上一个算子的输出数据集,以及一个数据集对象TYPE_FLINK_PROCESS_SINK发送数据集到下一个算子;所述子集在Flink的FlatMap算子的RichFlatMapFunction代码使用,定义为TransformCollection4-5,所述FlatMap算子后续跟上Sort算子,Transform3与sort1之间的组件翻译转化完成。
Sort1节点后续无SplittingNode,后续所有节点以及节点之间的路由线构成的一个组件子集,定义为TransformFileSinkCollection1;由于无后续SplittingNode,不用输出数据集供后续算子使用,因此所述子集只构造一个数据源节点TYPE_FLINK_PROCESS_SOURCE接收上一个算子的输出数据集,无需构建发送节点TYPE_FLINK_PROCESS_SINK,所述子集在flink的flatMap算子的RichFlatMapFunction代码使用。
Transform3与Sort2之间的组件集合由Transform6、Transform7以及Transform3与Sort2之间的组件的路由线构成;所述子集运行的ETL子流程从上一个算子的输出数据集接收数据,经过Transform7转换后,输出数据集供后续算子Sort使用;因此所述子集还必须构造一个数据源节点TYPE_FLINK_PROCESS_SOURCE接收上一个算子的输出数据集,以及一个数据集发送节点TYPE_FLINK_PROCESS_SINK发送数据到下一个算子;所述子集在flink的flatMap算子的RichFlatMapFunction代码使用,定义为TransformCollection6-7,完成Transform3与sort2之间的组件翻译转化。
所述Sort2节点后续无SplittingNode,后续所有节点以及节点之间的路由线构成的一个组件子集;定义为TransformFileSinkCollection2;由于无后续SplittingNode,不用输出数据集供后续算子使用,因此所述子集只需构造一个数据源节点TYPE_FLINK_PROCESS_SOURCE接收上一个算子的输出数据集,无需构建发送节点TYPE_FLINK_PROCESS_SINK;所述子集在flink的flatMap算子的RichFlatMapFunction代码使用。
具体如下:
Figure BDA0003442251520000191
所述flatMap算子的ETLDataSetProcessFunction实现flink的RichFlatMapFunction接口,具体如下
Figure BDA0003442251520000201
原本Flink提供的RichFlatMapFunction通过flatMap接受一个消息数据message,经过计算处理,通过参数collector发送给下一个算子;
而本方法的FlatMap仅接收一条数据消息message,然后直接通过消息队列存取的方式发送给所述Function在open初始化启动的ETL子流程运行中的数据集对象TYPE_FLINK_PROCESS_SOURCE组件,然后由ETL子流程进行计算处理,由所述子流程的YPE_FLINK_PROCESS_SINK组件调用collector发送给下一个算子。
实施例10:
本发明实施例10提供了一种Flink框架运行ETL的流程联合组件方法,本实施例10相比实施例1为在Flink算子输出的是数据流具体的情景来展现本方案的实施流程。
如图11所示,其中,KafKa source为数据源节点;Transform3为FLINK_MESSAGE_SHARED_NODE节点;Kafka Sink1、Kafka Sink2、Table Sink为FLINK_CONNECTOR_NODE节点。
Source算子执行所述Source的SourceFunction,读取数据以数据流的形式发送到后续算子。
Transform1、Transform2、Transform3、Transform4、Transform5、Transform6、Transform7、Transform8与Transform9各自接收到对应数据后,Transform1、Transform2、Transform3、Transform4、Transform5、Transform6、Transform7、Transform8与Transform9的ProcessFunction执行各自的数据转换,生成新的数据流发送到后续节点;
其中,Transform3生成的数据流作为Transform4、Transform6与Transform8数据流源头共享使用。
Transform5、Transform7与Transform9生成的数据流发送到后续的sink算子,装载写入相应的目的。
具体的,Kafka source节点、Transform3节点、Kafka Sink1节点与Kafka Sink2节点为Splitting属性的节点;两个Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的路由线构成的流程组件子集,所述集合在一个Flink算子ProcessFunction中运行,然后作为SplittingNode算子的输入。
其中,Kafka source节点与Transform3节点之间的子集为Transform1节点、Transform2节点、Transform3节点以及它们之间的路由线;所述子集运行ETL子流程接收从Kafka Source算子输出的数据流,经过作为Splitting属性的节点的Transform3节点的转换后,Transform3节点将数据流输出给下一个子集的算子;因此为了所述Transform3节点所在的子集能够接收所述数据流,所述子集构造一个数据集对象TYPE_FLINK_PROCESS_SOURCE用于接收上一个算子的数据流,以及所述数据集对象TYPE_FLINK_PROCESS_SINK将接收到的数据流发送给下一个子集的算子;所述子集Transform1节点、Transform2节点与Transform3节点在Flink的Transform算子的ProcessFunction代码使用,定义为TransformCollection1-2-3,完成Kafka source与Transform3之间的节点翻译转化。
Transform3节点与Kafka Sink1节点之间的子集为Transform4节点、Transform5节点以及Transform3节点与Kafka Sink1节点之间的各个节点间的路由线;所述子集运行的ETL子流程接收从上一个算子输出的数据流,经过作为Splitting属性的节点的Transform5节点的转换后,Transform5节点将数据流输出给下一个子集的算子;因此为了所述Transform5节点所在的子集能够接收所述数据流,所述子集构造一个数据集对象TYPE_FLINK_PROCESS_SOURCE用于接收上一个算子的数据流,以及所述数据集对象TYPE_FLINK_PROCESS_SOURCE将接收到的数据流发送给下一个子集的算子;所述子集Transform4节点与Transform5节点在Flink的Transform算子的ProcessFunction代码使用,定义为TransformCollection4-5,完成kafka sink1与Transform3之间的节点翻译转化。
Table sink节点为表数据装载,所述Table sink节点不使用flink的sink算子,在Transform3节点与kafka sink2节点之间的节点集合中使用;这个集合由Transform6节点、Transform7节点、Transform8节点、Transform9节点、table sink节点以及Transform3节点与kafka sink2节点之间的组件的路由线构成;所述子集运行的ETL子流程接收从上一个子集的算子输出的数据流,经过作为Splitting属性的节点的Transform7节点的转换后,Transform7节点将数据流输出给下一个子集的算子;因此为了所述Transform7节点所在的子集能够接收所述数据流,所述子集构造一个数据集对象TYPE_FLINK_PROCESS_SOURCE用于接收上一个算子的数据流,以及所述数据集对象TYPE_FLINK_PROCESS_Sink将接收到的数据流发送给下一个子集的算子;所述子集Transform6节点、Transform7节点、Transform8节点、Transform9节点与Table Sink节点在Flink的Transform算子的ProcessFunction代码使用,定义为TransformCollection6-9,完成kafka sink2与Transform3之间的节点翻译转化。
其中transform算子的ETLProcessFunction具体如下:
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
DataStream sourceStream=env.addSource(new FlinkKafkaConsumer(Kafkasource));
ETLProcessFunction function=new ETLProcessFunction(TransformCollection1-2-3);
ProcessOperator operator=new ProcessOperator(function);
DataStrean t3Stream=sourceStream.transform(“Process”,messageTypeInfo,operator);
ETLProcessFunction function4-5=new ETLProcessFunction(TransformCollection4-5);
ProcessOperator operator4-5=new ProcessOperator(function4-5);
t3Stream.transform(“Process”,messageTypeInfo,operator4-5).addSink(newFlinkKafkaProducer(kafka sink1));
ETLProcessFunction function6-9=new ETLProcessFunction(TransformCollection6-9);
ProcessOperator operator6-9=new ProcessOperator(function6-9);
t3Stream.transform(“Process”,messageTypeInfo,operator6-9).addSink(newFlinkKafkaProducer(kafka sink2));
上述transform算子的ETLProcessFunction实现flink ProcessFunction接口,具体如下:
Figure BDA0003442251520000221
其中,Flink提供的ProcessFunction通过ProcessElement函数接受一个消息数据message,然后经过计算处理,通过参数collector发送给下一个算子;所述ProcessFunction仅接收一条数据消息message,然后直接通过消息队列存取的方式发送给所述ETLProcessFunction在open初始化启动的ETL子流程运行中的数据源节点TYPE_FLINK_PROCESS_SOURCE组件,由ETL子流程进行计算处理,所述子流程的TYPE_FLINK_PROCESS_SINK组件调用collector发送给下一个算子。
实施例11:
如图11所示,是本发明实施例的一种Flink框架运行ETL的流程联合组件装置的装置示意图。本实施例的Flink框架运行ETL的流程联合组件装置包括一个或多个处理器21以及存储器22。其中,图11中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图9中以通过总线连接为例。
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例1中的Flink框架运行ETL的流程联合组件方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行Flink框架运行ETL的流程联合组件方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的一种Flink框架运行ETL的流程联合组件方法,例如,执行以上描述的图1-图11所示的各个步骤。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种Flink框架运行ETL的流程联合组件方法,其特征在于,方法包括:
遍历ETL的有向无环图DAG,识别出一个或者多个Splitting属性的节点;其中,所述Splitting属性节点包括数据源节点、FLINK_MESSAGE_SHARED_NODE属性的节点与需要转化为Flink算子的节点中的一个或者多个;
按照ETL流程DAG有向无环图节点先后顺序,从数据源节点开始,以相邻的两个所述Splitting属性的节点作为依据,生成由相邻的两个所述Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成的ETL流程子集,在Flink算子中使用;构造所述两个相邻Splitting属性的节点之间所对应的flink API语句操作算子链;
Union联合组件将至少两个所述数据源节点数据进行联合,所述数据源节点在Flink框架的TaskManager节点分区或者分片并发读取;
当所述union联合组件的下游存在需要转化为Flink算子的节点时,所述union联合组件转换为Flink的union算子;当所述union联合组件的下游不存在需要转化为Flink算子的节点时,所述union联合组件不转换为Flink的union算子;对应构造各个数据联合的flinkAPI语句操作算子链;配置ETL union组件输出基准列,所述数据联合转换的逻辑由flink算子中运行的所述各个ETL流程子集处理。
2.根据权利要求1所述的Flink框架运行ETL的流程联合组件方法,其特征在于,所述配置ETL union组件输出基准列,所述数据联合转换的逻辑由flink算子中运行的所述各个ETL流程子集处理,具体包括:
配置ETL union组件输出基准列,定义其中一个数据源列信息为基准列信息,定义除开基准列以外的数据源列信息为非基准列信息,所述非基准列信息按照基准列信息进行匹配;所述非基准列数据在ETL流程中处理。
3.根据权利要求1所述的Flink框架运行ETL的流程联合组件方法,其特征在于,当union联合组件的下游子集存在所述需要转化为Flink算子的节点时,则所述union联合组件转化为Flink的union算子,设置所述union联合组件节点属性FLINK_UNION_NODE为true;
当union联合组件的下游子集不存在所述Flink算子的节点时,则所述union联合组件不转化为Flink的union算子,设置所述union联合组件节点属性FLINK_UNION_NODE为false。
4.根据权利要求3所述的Flink框架运行ETL的流程联合组件方法,其特征在于,所述union联合组件节点属性FLINK_UNION_NODE设置为true时,所述union联合组件上游的Splitting属性的节点后续直至所述union联合组件构成ETL流程子集,所述ETL流程子集封装在上一个ETL流程子集中的Splitting属性的节点对应的算子的后续的flink的transform算子或者flatMap算子的ProcessFunction中运行,所述transform算子或者flatMap算子的输出作为Flink union算子的输入;union算子的输出作为union节点后续算子的输入。
5.根据权利要求3所述的Flink框架运行ETL的流程联合组件方法,其特征在于,所述union联合组件节点属性FLINK_UNION_NODE设置为false时,所述union联合组件上游的Splitting属性的节点后续所有组件构成的组件构成ETL流程子集,所述ETL流程子集封装在上一个ETL流程子集中的Splitting属性的节点对应的算子的后续的flink的transform算子或者flatMap算子的ProcessFunction中运行,所述ProcessFunction中运行的ETL流程子集中的union节点只有一个输入。
6.根据权利要求1所述的Flink框架运行ETL的流程联合组件方法,其特征在于,合并运行于Flink算子的子任务Function内的子流程的统计信息,获取ETL流程中所有组件的统计信息。
7.根据权利要求1所述的Flink框架运行ETL的流程联合组件方法,其特征在于,所述的需要转化为Flink算子的节点具体包括FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点;
搜索出ETL流程中所有的需要转化为Flink算子的节点,所述节点的上游一直到数据源节点的路由线设置为FLINK_MESSAGE_SHARED_ROUTER属性。
8.根据权利要求1所述的Flink框架运行ETL的流程联合组件方法,其特征在于,数据源节点开始,如果节点存在至少两个分支路由线,并且有至少两个分支路由线被设置为FLINK_MESSAGE_SHARED_ROUTER属性,则所述节点为FLINK_MESSAGE_SHARED_NODE属性的节点,设置FLINK_MESSAGE_SHARED_NODE属性;
其中需要转化为Flink算子的节点不设置为FLINK_MESSAGE_SHARED_NODE节点。
9.根据权利要求1所述的Flink框架运行ETL的流程联合组件方法,其特征在于,遍历ETL的有向无环图DAG,识别出数据源节点、FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点,并根据所述FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点识别出所有FLINK_MESSAGE_SHARED_NODE属性的节点,将所述数据源节点、FLINK_REDUCE_NODE属性的节点、FLINK_CONNECTOR_NODE属性的节点与FLINK_MESSAGE_SHARED_NODE属性的节点设置为Splitting属性的节点;
以相邻的两个所述Splitting属性的节点作为依据,生成由相邻的两个所述Splitting属性的节点之间的一个或者多个ETL节点构成的子集。
10.一种Flink框架运行ETL的流程联合组件装置,其特征在于,Flink框架运行ETL的流程分解装置包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行权利要求1-9任一所述的Flink框架运行ETL的流程联合组件方法。
CN202111639180.4A 2021-12-29 2021-12-29 一种Flink框架运行ETL的流程联合组件方法和装置 Active CN114385138B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111639180.4A CN114385138B (zh) 2021-12-29 2021-12-29 一种Flink框架运行ETL的流程联合组件方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111639180.4A CN114385138B (zh) 2021-12-29 2021-12-29 一种Flink框架运行ETL的流程联合组件方法和装置

Publications (2)

Publication Number Publication Date
CN114385138A true CN114385138A (zh) 2022-04-22
CN114385138B CN114385138B (zh) 2023-01-06

Family

ID=81199895

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111639180.4A Active CN114385138B (zh) 2021-12-29 2021-12-29 一种Flink框架运行ETL的流程联合组件方法和装置

Country Status (1)

Country Link
CN (1) CN114385138B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100162260A1 (en) * 2008-12-18 2010-06-24 Veda Technology Limited Data Processing Apparatus
CN112667593A (zh) * 2020-12-27 2021-04-16 武汉达梦数据库股份有限公司 一种ETL流程执行hbase快速装载的方法与装置
CN112667719A (zh) * 2020-12-27 2021-04-16 武汉达梦数据库股份有限公司 一种hadoop集群运行ETL的流程分解方法与装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100162260A1 (en) * 2008-12-18 2010-06-24 Veda Technology Limited Data Processing Apparatus
CN112667593A (zh) * 2020-12-27 2021-04-16 武汉达梦数据库股份有限公司 一种ETL流程执行hbase快速装载的方法与装置
CN112667719A (zh) * 2020-12-27 2021-04-16 武汉达梦数据库股份有限公司 一种hadoop集群运行ETL的流程分解方法与装置

Also Published As

Publication number Publication date
CN114385138B (zh) 2023-01-06

Similar Documents

Publication Publication Date Title
CN110888722B (zh) 任务处理方法、装置、电子设备及计算机可读存储介质
US9665660B2 (en) Logical data flow mapping rules for (sub) graph isomorphism in a cluster computing environment
US10061858B2 (en) Method and apparatus for processing exploding data stream
US20120310917A1 (en) Accelerated Join Process in Relational Database Management System
US20050097300A1 (en) Processing system and method including a dedicated collective offload engine providing collective processing in a distributed computing environment
CN110569312B (zh) 一种基于gpu的大数据快速检索系统及其使用方法
CN113900810A (zh) 分布式图处理方法、系统及存储介质
US20200119987A1 (en) Software defined network optimization using quantum computing
Yuang Survey of protocol verification techniques based on finite state machine models
CN112667719A (zh) 一种hadoop集群运行ETL的流程分解方法与装置
CN111125013A (zh) 一种数据入库方法、装置、设备及介质
US11789733B2 (en) Instruction processing apparatus, acceleration unit, and server
CN114385136B (zh) 一种Flink框架运行ETL的流程分解方法和装置
CN111914007A (zh) 一种hadoop集群运行ETL流程的方法及装置
CN114385138B (zh) 一种Flink框架运行ETL的流程联合组件方法和装置
CN114661752A (zh) 分布式数据库的计划调度方法、装置和系统
CN106878171B (zh) 一种用于多数据源的流式数据处理方法及装置
CN117472517A (zh) 一种基于Flink分布式处理FTP文件的方法
CN114385139B (zh) 一种flink框架运行ETL流程的消息序列化以及比较方法与装置
CN112667593A (zh) 一种ETL流程执行hbase快速装载的方法与装置
CN114385140B (zh) 基于flink框架的ETL流程组件多个不同输出的处理方法与装置
CN114385137B (zh) 一种Flink框架运行ETL的流程方法和装置
US11706097B2 (en) Task processing method applied to network topology, electronic device and storage medium
CN114996299A (zh) 分布式数据库的计划执行方法、装置和系统
Cushing et al. Automata-based dynamic data processing for clouds

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant