CN114385136A - 一种Flink框架运行ETL的流程分解方法和装置 - Google Patents
一种Flink框架运行ETL的流程分解方法和装置 Download PDFInfo
- Publication number
- CN114385136A CN114385136A CN202111638140.8A CN202111638140A CN114385136A CN 114385136 A CN114385136 A CN 114385136A CN 202111638140 A CN202111638140 A CN 202111638140A CN 114385136 A CN114385136 A CN 114385136A
- Authority
- CN
- China
- Prior art keywords
- flink
- node
- etl
- operator
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/252—Integrating or interfacing systems involving database management systems between a Database Management System and a front-end application
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/254—Extract, transform and load [ETL] procedures, e.g. ETL data flows in data warehouses
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Computing Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及数据处理技术领域,提供了一种Flink框架运行ETL的流程分解方法和装置。本发明专利就ETL流程翻译转化成flink API语句操作算子链提供了一种高效稳定便利方法。不用在操作算子Function重新实现数据处理逻辑代码,不破坏流程的完整性,基本保存单服务器版ETL流程原有的顺序性,并且与单服务器ETL DAG运行逻辑一致,完全重用ETL运行流程逻辑实现;既可以使用Flink内置的算子提供的Function或内置的connector提供的Function,又可以完全使用ETL组件进行数据的计算处理;任何ETL流程都可以翻译转化成Flink API语句的操作算子链,提交给Flink框架执行,具备通用便利性,完全避免flink算子函数中人工编写数据处理逻辑代码。
Description
【技术领域】
本发明涉及数据处理技术领域,特别是涉及一种Flink框架运行ETL的流程分解方法和装置。
【背景技术】
ETL是数据处理、构建数据仓库的一个重要工具软件,它完成异构数据源的抽取、清洗转换,然后加载的一个过程。传统的ETL一般是把流程发布到一个集中的ETL服务器节点上运行,所有的流程或流程内组件的运行采用多线程机制,再多的流程也只能在一个单一节点运行,并且一个大数据的处理流程,也无法提高数据处理的性能。
Flink大数据平台在大数据处理中已经取得相当广泛的应用,是一个分布式处理引擎框架,用于对无界和有界数据流进行有状态计算,具备极高的故障恢复性能和容错性能。
如果ETL流程能够提交到Flink框架运行,可以极大提高流程并发执行能力,并且可以充分利用流式处理的有状态计算来提高流程运行稳定可靠性。
由于Flink提交任务需要构建一个Source Stream->transform Stream->StreamSink的操作,因此,现有技术中若要将ETL流程直接在Flink的Source Stream->transformStream->Stream Sink的操作中实现,必定会涉及重新实现数据处理逻辑代码,需要破坏ETL流程的完整性。
鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。
【发明内容】
本发明要解决的技术问题是提供一种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语句操作算子链;
其中,在生成所述子集过程中,为每一个所述ETL流程子集分别构建TYPE_FLINK_PROCESS_SOURCE节点用于接收上一个Flink算子输出的数据集或者数据流,以及TYPE_FLINK_PROCESS_SINK节点用于将ETL流程子集转换处理后的数据发送给下一个flink算子;从而将ETL的处理过程承载到Flink框架中完成。
优选的,所述的需要转化为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流程子集的DAG并运行;所述相邻Splitting属性的节点之间构造一条flink API操作算子链,所述相邻Splitting属性的节点中的前一个Splitting属性的节点对应的flink算子的输出数据流或数据集作为所述flink API操作算子链的输入,所述flink API操作算子链的输入后续构造一个使用所述ETL流程子集的Flink算子。
优选的,当所述相邻Splitting属性的节点中的后一个Splitting属性的节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,所述后一个Splitting属性的节点不转化为对应的Flink算子;
当所述相邻Splitting属性的节点中的后一个Splitting属性的节点不为FLINK_MESSAGE_SHARED_NODE属性的节点时,所述后一个Splitting属性的节点需要转化为对应的flink算子,所述flink算子输入为两个相邻Splitting属性的节点之间ETL流程子集的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组件之间传递的数据封装对象。
优选的,在所述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组件之间传递的数据封装对象。
优选的,在遍历ETL的有向无环图DAG,抵达一个Splitting属性的节点,并确认所述Splitting属性的节点之后仅包含非Splitting属性的节点时,方法还包括:
位于所述Splitting属性的节点后的非Splitting属性的节点构成的一个子集;其中,所述子集无后续Splitting属性的节点,不用输出数据集或者数据流供后续Flink算子使用;
为所述子集构造一个TYPE_FLINK_PROCESS_SOURCE节点接收上一个算子的输出数据,对于所述子集不构造TYPE_FLINK_PROCESS_SINK节点。
第二方面,Flink框架运行ETL的流程分解装置包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行所述的Flink框架运行ETL的流程分解方法。
本发明专利就ETL流程翻译转化成Flink操作算子链提供了一种高效稳定便利方法。不用在操作算子Function重新实现数据处理逻辑代码,不破坏流程的完整性,基本保存单服务器版ETL流程原有的顺序性,并且与单服务器ETL DAG运行逻辑一致,完全重用ETL运行流程逻辑实现;既可以使用Flink内置的算子提供的Function或内置的connector提供的Function,又可以完全使用ETL组件进行数据的计算处理;任何ETL流程都可以翻译转化成Flink的操作算子链,提交给Flink框架执行,具备通用便利性,完全避免Flink算子中人工编写数据处理逻辑代码。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种Flink框架运行ETL的流程分解方法的流程示意图;
图2是本发明实施例提供的一种Flink框架运行ETL的流程分解方法的ETL流程的DAG示意图;
图3是本发明实施例提供的一种Flink框架运行ETL的流程分解方法在Flink框架下运行的DAG示意图;
图4是本发明实施例提供的一种Flink框架运行ETL的流程分解方法在Flink框架下运行的DAG示意图;
图5是本发明实施例提供的一种Flink框架运行ETL的流程分解方法在Flink框架下运行的DAG示意图;
图6是本发明实施例提供的一种Flink框架运行ETL的流程分解方法在Flink框架下运行的DAG示意图;
图7是本发明实施例提供的一种Flink框架运行ETL的流程分解方法在Flink框架下运行的DAG示意图;
图8是本发明实施例提供的一种Flink框架运行ETL的流程分解方法在Flink框架下运行的DAG示意图;
图9是本发明实施例提供的一种Flink框架运行ETL的流程分解装置的装置示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在实现本发明方案之前,通过研究发现ETL提供了各种数据源的读取、装载组件,以及各种转换组件。数据源读取组件包括关系数据库、mongoDB、文件读取、hadoop生态的hbase以及hive、ES、以及kafka数据源读取等通用数据源读取组件;装载组件提供了这些数据源的对应装载组件;数据转换组件包括基于规则的数据清洗转换组件、联合组件、数据质量检测组件、排序、聚合、连接、增量比对等组件。一个ETL流程一般由一个或多个数据源组件、一个或多个数据装载组件、大于等于零个数据转换组件的DAG有向无环图组成。
另一方面,Flink提供了丰富的接口方便应用提交数据处理任务,一般通过核心API进行编程,比如DataStream API(有界或无界流数据)以及DataSet API(有界数据集)。这些API为数据处理提供了通用的构建模块,提供了很多source方法、转换(transformations)以及数据装载sink操作算子。以Flink的数据流为例,Data Source就是数据源输入,可以通过StreamExecutionEnvironment.addSource(SourceFunction)来获取一个数据源。Flink提供了大量的已经实现好的source方法,此外也可以实现SourceFunction来自定义Source,还可以实现ParallelSourceFunction接口或者扩展RichParallelSourceFunction来自定义并行的source。Flink的转换算子包括Map、flatMap、Filter、KeyBy、Reduce、Select、Connect、Union等算子。Flink提供了一部分的框架的sink,除此以外,需要用户实现SinkFunction自定义实现sink。本发明也是利用了向Flink提交任务需要构建一个Source Stream->transform Stream->Stream Sink的操作算子链的特性,然后提交到Flink框架执行。但是与现有技术中简单的将ETL过程由Flink的Source Stream->transform Stream->Stream Sink的操作算子链实现不同,本发明中Datatransformation会将一或多个DataStream转换成一个新的DataStream,一个DataStream会被下游一个或多个算子作为输入stream使用,从source到最终的数据落地sink就是也就是由一系列操作算子构成的DAG有向无环图。
因此,在本发明中ETL流程发布到Flink框架运行,必须把流程的组件做合适拆分,然后封装到Flink操作算子执行。数据源读取可放到自定义SourceFunction中运行或者利用Flink自带的SourceFunction,清洗转换组件可放到ProcessFunction中运行,kafka装载可直接使用Flink自带的FlinkKafkaProducer。Flink与Kafka具有天然紧密联系,Flink内置了比较完善的Kafka读取与装载,并且利用有状态计算,能做到故障恢复的exactly-once。但是绝大部分ETL组件实现在Flink框架并没有提供支撑。比如关系数据库的表装载,需要支持插入更新、数据库连接connection重试、装载过程中出现报错数据的错误输出处理等等处理过程,在ETL的表装载已经有很完善、高效率、很稳定的实现,如果把这部分实现代码重写到Flink算子的Process Function或Sink Function,一定会造成系统的代码冗余、维护繁杂、不稳定性。本发明采用了把某些ETL组件的集合构造一个DAG图,放在Flink的ProcessFunction中运行,不用在ProcessFunction重写数据处理的代码。如此实现的最核心的要解决的问题就是如何进行拆分。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
本发明实施例1提供了一种Flink框架运行ETL的流程分解方法和装置。
一种Flink框架运行ETL的流程分解方法,流程分解方法包括:
遍历ETL的有向无环图DAG,识别出一个或者多个Splitting属性的节点;其中,所述Splitting属性节点包括数据源节点、FLINK_MESSAGE_SHARED_NODE属性的节点与需要转化为Flink算子的节点中的一个或者多个;
ETL流程中数据源节点为流程的起始节点,存在一个输出,没有输入,使用flink的SourceFunction生成数据供后续算子作为输入使用,其中所述数据包括DataSet或DataStream,也就是数据集或数据流;
所述Flink算子的节点为将ETL流程分解使用Flink框架运行时需要转化为Flink算子的节点;
所述FLINK_MESSAGE_SHARED_NODE属性的节点后续存在至少两个需要翻译转化为Flink算子;
所述FLINK_MESSAGE_SHARED_NODE属性的节点与Flink算子的节点都是接收上一个节点的输出数据后,生成一个新的输出数据,输出给后续算子。
由于在以Flink框架运行ETL流程的方法中,需要根据ETL组件节点集合构造FlinkAPI语句,而一条Flink API语句使用一个或多个输入,一个输出,需要将两个FLINK_SPLITTING_NODE之间组件集合运行在Flink算子里面,因此存在以下优选方案:
将所述数据源节点、FLINK_MESSAGE_SHARED_NODE属性的节点与Flink算子的节点均定义为FLINK_SPLITTING_NODE属性的节点。
根据相邻的Splitting属性的节点之间的ETL节点集合,构造Flink API语句,优选的:
按照ETL流程DAG有向无环图节点先后顺序,从数据源节点开始,以相邻的两个所述Splitting属性的节点作为依据,生成由相邻的两个所述Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成的ETL流程子集,在Flink算子中使用;构造所述两个相邻Splitting属性的节点之间所对应的flink API语句操作算子链;
其中所述Flink算子为flatMap算子或者transform算子,从数据源节点开始每一个分支搜索下一个Splitting属性的节点,如果所述Splitting属性的节点为空,则从上一轮搜索开始中间搜索到的所有节点以及节点之间的连接线构成组成一个ETL流程子集,将所述集合在一个Flink算子ProcessFunction中运行;如果所述搜索到的Splitting属性的节点不为空,则从上一轮搜索开始中间搜索到的所有节点以及节点之间的路由线构成组成一个集合,将所述集合在一个Flink算子ProcessFunction中运行,然后作为SplittingNode算子的输入。
其中,在生成所述子集过程中,为每一个所述ETL流程子集分别构建TYPE_FLINK_PROCESS_SOURCE节点用于接收上一个Flink算子输出的数据集或者数据流,以及TYPE_FLINK_PROCESS_SINK节点用于将ETL流程子集转换处理后的数据发送给下一个flink算子;从而将ETL的处理过程承载到Flink框架中完成。
优选的,所述TYPE_FLINK_PROCESS_SOURCE节点为Flink算子ProcessFunction,所述Flink算子ProcessFunction的输入为上一个Flink算子的输出,所述Flink算子ProcessFunction的输出为下一个子集中Flink算子ProcessFunction的输入或者ETL输出节点,其中Flink算子为SplittingNode算子,按照上述步骤处理各个SplittingNode算子,从而将ETL的处理过程承载到Flink框架中完成。
本发明把ETL组件的集合构造一个DAG图,放在Flink的ProcessFunction中运行,不用在ProcessFunction重写数据处理的代码,避免把代码重写到Flink算子的ProcessFunction或Sink Function,从而导致系统的代码冗余、维护繁杂、不稳定性。
由于需要遍历ETL的有向无环图DAG,确定出一个或者多个Splitting属性的节点,但所述识别Splitting属性的节点的流程中,仅能识别出Flink的算子的节点,而所述FLINK_MESSAGE_SHARED_NODE属性的节点并非Flink算子的节点,因此需要设置出FLINK_MESSAGE_SHARED_NODE属性的节点,存在以下优选方法:
如图1所示,Flink框架运行ETL的流程分解流程如下:
步骤101中,遍历ETL的DAG,识别出数据源节点与Flink算子的节点;
步骤102中,所述识别出来的Flink算子的节点的上游一直到数据源节点的路由线设置为FLINK_MESSAGE_SHARED_ROUTER属性;
所述Flink算子的节点具体包括FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点
步骤103中,数据源节点开始,如果存在节点存在至少两个分支路由线,并且有至少两个分支路由线被设置为FLINK_MESSAGE_SHARED_ROUTER属性,则所述节点为FLINK_MESSAGE_SHARED_NODE属性的节点,设置FLINK_MESSAGE_SHARED_NODE属性。
步骤104中,将数据源节点、Flink算子的节点以及FLINK MESSAGE SHARED NODE属性的节点定义为Splitting属性的节点;
步骤105中,识别出所有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算子的输出。
步骤106中,在生成所述子集过程中,为每一个所述子集分别构建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接口,具体如下:
实施例2:
本发明实施例2提供了一种Flink框架运行ETL的流程分解方法,本实施例2相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图2所示,为ETL不在Flink框架中的运行流程,本实施例中ETL流程存在一个数据源节点、三个转换节点与两个转载节点。
其中ETL流程里面的节点以及节点之间的路由线构造DAG有向无环图;
数据源节点读取数据并发送到后续转换节点1;
转换节点1读取数据并运行完成后发送给后续转换节点2与转换节点3;
转换节点2与转换节点3读取数据并运行完成后分别发送给转载节点1与转载节点2;
转载节点1与转载节点2对接收到的数据完成装载,流程运行完毕。
如图3所示,所述ETL流程提交到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算子,装载写入相应的目的。
实施例3:
本发明实施例3提供了一种Flink框架运行ETL的流程分解方法,本实施例3相比实施例1在更加实际场景下来展现本方案的实施流程。
如图4所示,本发明实施例是在只有一个数据源节点、无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。
实施例4:
本发明实施例4提供了一种Flink框架运行ETL的流程分解方法,本实施例4相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图5所示,本发明实施例是在同时存在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的算子,装载写入相应的目的。
实施例5:
本发明实施例5提供了一种Flink框架运行ETL的流程分解方法,本实施例5相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图6所示,本发明实施例是在同时存在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来运行;
实施例6:
本发明实施例6提供了一种Flink框架运行ETL的流程分解方法,本实施例6相比实施例1为在Flink算子输出的是数据集具体的情景来展现本方案的实施流程。
如图7所示,其中: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代码使用。
具体如下:
ExecutionEnvironment env=
ExecutionEnvironment.getExecutionEnvironment();
DataSet sourceDataSet=env.createInput(new TableSourceInputFormat(Table source));
ETLDataSetProcessFunction function=new ETLDataSetProcessFunction(TransformCollection1-2-3);
DataStrean t3DataSet=sourceDataSet.flatMap(function).returns(messageTypeInfo);
ETLDataSetProcessFunction function4-5=new ETLDataSetProcessFunction(TransformCollection4-5);
DataSet t5Dataset=t3DataSet.flatMap(function4-5).returns(messageTypeInfo).;
DataSet sor1DataSet=new SortPartitionOperator(t5Dataset,newSelectorFunctionKeys(sort1));
ETLDataSetProcessFunction functionFileSink1=newETLDataSetProcessFunction(TransformFileSinkCollection1);
sor1DataSet.flatMap(functionFileSink1).returns(messageTypeInfo).;
ETLDataSetProcessFunction function6-7=new ETLDataSetProcessFunction(TransformCollection6-7);
DataSet t7Dataset=t3DataSet.flatMap(function6-7).returns(messageTypeInfo).;
DataSet sor2DataSet=new SortPartitionOperator(t7Dataset,newSelectorFunctionKeys(sort2));
ETLDataSetProcessFunction functionFileSink2=newETLDataSetProcessFunction(TransformFileSinkCollection2);
sor2DataSet.
flatMap(functionFileSink2).returns(messageTypeInfo).;
所述flatMap算子的ETLDataSetProcessFunction实现flink的RichFlatMapFunction接口,具体如下
原本Flink提供的RichFlatMapFunction通过flatMap接受一个消息数据message,经过计算处理,通过参数collector发送给下一个算子;
而本方法的FlatMap仅接收一条数据消息message,然后直接通过消息队列存取的方式发送给所述Function在open初始化启动的ETL子流程运行中的数据集对象TYPE_FLINK_PROCESS_SOURCE组件,然后由ETL子流程进行计算处理,由所述子流程的YPE_FLINK_PROCESS_SINK组件调用collector发送给下一个算子。
实施例7:
本发明实施例7提供了一种Flink框架运行ETL的流程分解方法,本实施例7相比实施例1为在Flink算子输出的是数据流具体的情景来展现本方案的实施流程。
如图8所示,其中: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(Kafka
source
));
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接口,具体如下:
其中,Flink提供的ProcessFunction通过ProcessElement函数接受一个消息数据message,然后经过计算处理,通过参数collector发送给下一个算子;所述ProcessFunction仅接收一条数据消息message,然后直接通过消息队列存取的方式发送给所述ETLProcessFunction在open初始化启动的ETL子流程运行中的数据源节点TYPE_FLINK_PROCESS_SOURCE组件,由ETL子流程进行计算处理,所述子流程的TYPE_FLINK_PROCESS_SINK组件调用collector发送给下一个算子。
实施例8:
如图9所示,是本发明实施例的一种Flink框架运行ETL的流程分解装置的架构示意图。本实施例的Flink框架运行ETL的流程分解装置包括一个或多个处理器901以及存储器902。其中,图9中以一个处理器901为例。
处理器901和存储器902可以通过总线或者其他方式连接,图9中以通过总线连接为例。
存储器902作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例1中的Flink框架运行ETL的流程分解方法。处理器901通过运行存储在存储器902中的非易失性软件程序和指令,从而执行Flink框架运行ETL的流程分解方法。
存储器902可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器902可选包括相对于处理器901远程设置的存储器,这些远程存储器可以通过网络连接至处理器901。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器902中,当被所述一个或者多个处理器901执行时,执行上述实施例1中的一种Flink框架运行ETL的流程分解方法,例如,执行以上描述的图2-图8所示的各个步骤。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种Flink框架运行ETL的流程分解方法,其特征在于,流程分解方法包括:
遍历ETL的有向无环图DAG,识别出一个或者多个Splitting属性的节点;其中,所述Splitting属性节点包括数据源节点、FLINK_MESSAGE_SHARED_NODE属性的节点与需要转化为Flink算子的节点中的一个或者多个;
按照ETL流程DAG有向无环图节点先后顺序,从数据源节点开始,以相邻的两个所述Splitting属性的节点作为依据,生成由相邻的两个所述Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成的ETL流程子集,在Flink算子中使用;构造所述两个相邻Splitting属性的节点之间所对应的flink API语句操作算子链;
其中,在生成所述子集过程中,为每一个所述ETL流程子集分别构建TYPE_FLINK_PROCESS_SOURCE节点用于接收上一个Flink算子输出的数据集或者数据流,以及TYPE_FLINK_PROCESS_SINK节点用于将ETL流程子集转换处理后的数据发送给下一个flink算子;从而将ETL的处理过程承载到Flink框架中完成。
2.根据权利要求1所述的Flink框架运行ETL的流程分解方法,其特征在于,所述的需要转化为Flink算子的节点具体包括FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点;
搜索出ETL流程中所有的需要转化为Flink算子的节点,所述节点的上游一直到数据源节点的路由线设置为FLINK_MESSAGE_SHARED_ROUTER属性。
3.根据权利要求2所述的Flink框架运行ETL的流程分解方法,其特征在于,数据源节点开始,如果节点存在至少两个分支路由线,并且有至少两个分支路由线被设置为FLINK_MESSAGE_SHARED_ROUTER属性,则所述节点为FLINK_MESSAGE_SHARED_NODE属性的节点,设置FLINK_MESSAGE_SHARED_NODE属性;
其中需要转化为Flink算子的节点不设置为FLINK_MESSAGE_SHARED_NODE节点。
4.根据权利要求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节点构成的子集。
5.根据权利要求1所述的Flink框架运行ETL的流程分解方法,其特征在于,所述Flink算子被调用时,构造所述ETL流程子集的DAG并运行;所述相邻Splitting属性的节点之间构造一条flink API操作算子链,所述相邻Splitting属性的节点中的前一个Splitting属性的节点对应的flink算子的输出数据流或数据集作为所述flink API操作算子链的输入,所述flink API操作算子链的输入后续构造一个使用所述ETL流程子集的Flink算子。
6.根据权利要求1所述的Flink框架运行ETL的流程分解方法,其特征在于,当所述相邻Splitting属性的节点中的后一个Splitting属性的节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,所述后一个Splitting属性的节点不转化为对应的Flink算子;
当所述相邻Splitting属性的节点中的后一个Splitting属性的节点不为FLINK_MESSAGE_SHARED_NODE属性的节点时,所述后一个Splitting属性的节点需要转化为对应的flink算子,所述flink算子输入为两个相邻Splitting属性的节点之间ETL流程子集的Flink算子的输出。
7.根据权利要求1所述的Flink框架运行ETL的流程分解方法,其特征在于,当所述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组件之间传递的数据封装对象。
8.根据权利要求1所述的Flink框架运行ETL的流程分解方法,其特征在于,在所述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组件之间传递的数据封装对象。
9.根据权利要求1所述的Flink框架运行ETL的流程分解方法,其特征在于,在遍历ETL的有向无环图DAG,抵达一个Splitting属性的节点,并确认所述Splitting属性的节点之后仅包含非Splitting属性的节点时,方法还包括:
位于所述Splitting属性的节点后的非Splitting属性的节点构成的一个子集;其中,所述子集无后续Splitting属性的节点,不用输出数据集或者数据流供后续Flink算子使用;
为所述子集构造一个TYPE_FLINK_PROCESS_SOURCE节点接收上一个算子的输出数据,对于所述子集不构造TYPE_FLINK_PROCESS_SINK节点。
10.一种Flink框架运行ETL的流程分解装置,其特征在于,Flink框架运行ETL的流程分解装置包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行权利要求1-9任一所述的Flink框架运行ETL的流程分解方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111638140.8A CN114385136B (zh) | 2021-12-29 | 2021-12-29 | 一种Flink框架运行ETL的流程分解方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111638140.8A CN114385136B (zh) | 2021-12-29 | 2021-12-29 | 一种Flink框架运行ETL的流程分解方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114385136A true CN114385136A (zh) | 2022-04-22 |
CN114385136B CN114385136B (zh) | 2022-11-22 |
Family
ID=81198965
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111638140.8A Active CN114385136B (zh) | 2021-12-29 | 2021-12-29 | 一种Flink框架运行ETL的流程分解方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114385136B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024000585A1 (zh) * | 2022-07-01 | 2024-01-04 | 西门子股份公司 | 用于数据跟踪的数据处理方法、装置、系统以及电子设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104391929A (zh) * | 2014-11-21 | 2015-03-04 | 浪潮通用软件有限公司 | 一种etl中数据流的传递方法 |
CN109345377A (zh) * | 2018-09-28 | 2019-02-15 | 北京九章云极科技有限公司 | 一种数据实时处理系统及数据实时处理方法 |
CN110851514A (zh) * | 2019-10-17 | 2020-02-28 | 杭州安恒信息技术股份有限公司 | 基于flink的etl处理方法 |
US20200073987A1 (en) * | 2018-09-04 | 2020-03-05 | Salesforce.Com, Inc. | Technologies for runtime selection of query execution engines |
CN112328458A (zh) * | 2020-11-27 | 2021-02-05 | 杭州安恒信息技术股份有限公司 | 基于flink数据引擎的数据处理方法、装置 |
CN112364084A (zh) * | 2020-11-18 | 2021-02-12 | 深圳航天智慧城市系统技术研究院有限公司 | 一种深入定制算法集成的可视化数据处理方法及系统 |
CN113360554A (zh) * | 2020-03-06 | 2021-09-07 | 深圳法大大网络科技有限公司 | 一种数据抽取、转换和加载etl的方法和设备 |
-
2021
- 2021-12-29 CN CN202111638140.8A patent/CN114385136B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104391929A (zh) * | 2014-11-21 | 2015-03-04 | 浪潮通用软件有限公司 | 一种etl中数据流的传递方法 |
US20200073987A1 (en) * | 2018-09-04 | 2020-03-05 | Salesforce.Com, Inc. | Technologies for runtime selection of query execution engines |
CN109345377A (zh) * | 2018-09-28 | 2019-02-15 | 北京九章云极科技有限公司 | 一种数据实时处理系统及数据实时处理方法 |
CN110851514A (zh) * | 2019-10-17 | 2020-02-28 | 杭州安恒信息技术股份有限公司 | 基于flink的etl处理方法 |
CN113360554A (zh) * | 2020-03-06 | 2021-09-07 | 深圳法大大网络科技有限公司 | 一种数据抽取、转换和加载etl的方法和设备 |
CN112364084A (zh) * | 2020-11-18 | 2021-02-12 | 深圳航天智慧城市系统技术研究院有限公司 | 一种深入定制算法集成的可视化数据处理方法及系统 |
CN112328458A (zh) * | 2020-11-27 | 2021-02-05 | 杭州安恒信息技术股份有限公司 | 基于flink数据引擎的数据处理方法、装置 |
Non-Patent Citations (4)
Title |
---|
JORGE VEIGA 等: ""Performance evaluation of big data frameworks for large-scale data analytics"", 《2016 IEEE INTERNATIONAL CONFERENCE ON BIG DATA (BIG DATA)》 * |
XINGOO: ""Flink基础:实时处理管道与ETL"", 《HTTPS://WWW.CNBLOGS.COM/XING901022/P/13961047.HTML》 * |
季航旭 等: ""分布式环境中的多作业执行调度策略与优化"", 《计算机工程与科学》 * |
阿里云实时计算FLINK: ""基于Flink的典型ETL场景实现"", 《HTTPS://DEVELOPER.ALIYUN.COM/ARTICLE/771019》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024000585A1 (zh) * | 2022-07-01 | 2024-01-04 | 西门子股份公司 | 用于数据跟踪的数据处理方法、装置、系统以及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN114385136B (zh) | 2022-11-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11526531B2 (en) | Dynamic field data translation to support high performance stream data processing | |
US7860863B2 (en) | Optimization model for processing hierarchical data in stream systems | |
Yuang | Survey of protocol verification techniques based on finite state machine models | |
CN114385136B (zh) | 一种Flink框架运行ETL的流程分解方法和装置 | |
CN111221842A (zh) | 大数据处理系统及方法 | |
CN113900810A (zh) | 分布式图处理方法、系统及存储介质 | |
CN113079198B (zh) | 一种云平台接口协议转换的方法及装置 | |
CN114244919B (zh) | 一种基于协议无感知转发的ndn模态实现方法 | |
CN104794095B (zh) | 分布式计算处理方法及装置 | |
CN112667719A (zh) | 一种hadoop集群运行ETL的流程分解方法与装置 | |
CN111221852A (zh) | 基于大数据的混合查询处理方法及装置 | |
CN111159268B (zh) | 一种ETL流程在Spark集群中运行的方法和装置 | |
CN112052235A (zh) | 一种区块链交易数据迁移的方法及装置 | |
CN106878171B (zh) | 一种用于多数据源的流式数据处理方法及装置 | |
US20200110584A1 (en) | Automated code generation for functional testing of software applications | |
CN111221888A (zh) | 大数据分析系统及方法 | |
CN111913721B (zh) | 自动化部署方法、装置、设备及存储介质 | |
CN114385137B (zh) | 一种Flink框架运行ETL的流程方法和装置 | |
CN114385139B (zh) | 一种flink框架运行ETL流程的消息序列化以及比较方法与装置 | |
WO2023222047A1 (zh) | 神经网络计算图的处理方法及处理单元、设备、介质 | |
CN114385138B (zh) | 一种Flink框架运行ETL的流程联合组件方法和装置 | |
CN114385140B (zh) | 基于flink框架的ETL流程组件多个不同输出的处理方法与装置 | |
CN107196860B (zh) | Sdn网络中网络编码进行组播传输的方法 | |
CN111221860A (zh) | 基于大数据的混合查询优化方法及装置 | |
CN112799673B (zh) | 一种网络协议数据的校核方法及装置 |
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 |