CN114385140B - 基于flink框架的ETL流程组件多个不同输出的处理方法与装置 - Google Patents
基于flink框架的ETL流程组件多个不同输出的处理方法与装置 Download PDFInfo
- Publication number
- CN114385140B CN114385140B CN202111642588.7A CN202111642588A CN114385140B CN 114385140 B CN114385140 B CN 114385140B CN 202111642588 A CN202111642588 A CN 202111642588A CN 114385140 B CN114385140 B CN 114385140B
- Authority
- CN
- China
- Prior art keywords
- node
- flink
- data
- attribute
- etl
- 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.)
- Active
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)
- 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算子中数据处理逻辑代码,避免重复实现数据拆分的逻辑代码;根据组件在流程中的特点,尽量在一个操作算子ProcessFunction运行重组后的组件集合,避免数据在多个操作算子拆分流转,从而减少线程切换、减少延迟并提高吞吐能力。
Description
【技术领域】
本发明涉及数据库技术领域,特别是涉及基于flink框架的ETL流程组件多个不同输出的处理方法与装置。
【背景技术】
ETL是数据处理、构建数据仓库的一个重要工具软件,它完成异构数据源的抽取、清洗转换,然后加载的一个过程。传统的ETL一般是把流程发布到一个集中的ETL服务器节点上运行,所有的流程或流程内组件的运行采用多线程机制,再多的流程也只能在一个单一节点运行,并且一个大数据的处理流程,也无法提高数据处理的性能。
Flink大数据平台在大数据处理中已经取得相当广泛的应用,是一个分布式处理引擎框架,用于对无界和有界数据流进行有状态计算,具备极高的故障恢复性能和容错性能。
如果ETL流程能够提交到Flink框架运行,可以极大提高流程并发执行能力,并且可以充分利用流式处理的有状态计算来提高流程运行稳定可靠性。
由于Flink提交任务需要构建一个Source Stream->transform Stream-> StreamSink的操作,因此,现有技术中若要将ETL流程直接在Flink的Source Stream->transformStream->Stream Sink的操作中实现,必定会涉及重新实现数据处理逻辑代码,需要破坏ETL流程的完整性。
ETL组件可能存在多个输出,并且每个输出可能输出不同的数据,比如表数据装载,装载过程中可能存在一些数据违反唯一性约束错误、非空约束错误等错误导致无法正常装载,并且这些错误数据也需要收集记录处理,所以表装载组件需要多个不同的输出,正常装载数据输出、某种或某些错误类型数据输出。再一个就是数据质量检测组件,组件可以定义多个检测规则,数据匹配或违反一个或多个规则,也存在一个组件可能有多个不同的数据输出。通过在组件输出线配置输出类型,从而实现根据配置的类型进行相应类型数据的输出。
Flink在早期版本流式处理提供了一个数据流可拆分为多个数据流的算子 split和select结合使用,后期版本已经废弃使用这个算子,采用侧输出流 SideOutPut预先建立OutputTag实例来替换split实现流的拆分。Flink对于一个数据集拆分并没有提供合适的操作算子,需要自定义操作算子实现。Flink 一般是从Source到Transform再到Sink数据流转的过程,算子之间并没有连接线的配置。
鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。
【发明内容】
本发明要解决的技术问题是提供基于flink框架的ETL流程组件多个不同输出的处理方法。
本发明进一步要解决的技术问题是提供基于flink框架的ETL流程组件多个不同输出的处理装置。
本发明采用如下技术方案:
第一方面,基于flink框架的ETL流程组件多个不同输出的处理方法和装置,流程方法包括:
遍历ETL的有向无环图DAG,识别出一个或者多个Splitting属性的节点;其中,所述Splitting属性节点包括数据源节点、FLINK_MESSAGE_SHARED_NODE 属性的节点与需要转化为Flink算子的节点中的一个或者多个;
当ETL流程中存在输出节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,则所述输出节点与所述输出节点上游的Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成ETL流程子集;所述输出节点的各个输出的下游组件分别构造ETL流程子集;
当ETL流程中存在输出节点为非Splitting属性的节点时,所述输出节点上游的Splitting属性的节点与所述输出节点下游的Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成ETL流程子集;
所有所述ETL流程子集构造对应的flink API语句并进行运行处理。
优选的,当ETL流程中存在输出节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,则设置所述输出节点属性FLINK_SPLITTING_NODE为true;
当ETL流程中存在输出节点为为非Splitting属性的节点时,则设置所述输出节点属性FLINK_SPLITTING_NODE为false。
优选的,当所述输出节点属性FLINK_SPLITTING_NODE为true时,所述输出节点上游的Splitting属性的节点与所述输出节点之间一个或者多个ETL节点并且包括所述输出节点自身以及节点之间的连接线构造ETL流程子集,所述输出节点的各个输出的下游组件分别构造一个包含输入节点、输出线以及输出节点的ETL流程子集;所有所述ETL流程子集均在flinkAPI算子 ProcessFunction中运行;其中所述输出节点对应的ETL流程子集的flink算子的输出为所述输出线对应的下游的ETL流程子集的flink算子的输入;
当输出节点属性FLINK_SPLITTING_NODE为false时,所述输出节点上游的Splitting属性的节点与所述输出节点下游组件的Splitting属性的节点之间所有的节点以及节点之间的连接线构成一个ETL流程子集,在flinkAPI算子 ProcessFunction中运行。
优选的,节点属性FLINK_SPLITTING_NODE为true时,所述节点根据不同的输出配置,对输入的数据进行处理并标记发送给下游算子,所述下游算子将带标记的数据还原为节点处理后的数据,将数据发送给对应的输出线并传递给下游节点。
优选的,节点属性FLINK_SPLITTING_NODE为false时,所述节点对输入数据进行处理,并且根据输出线的数据类型配置,直接将数据发送到各自对应的下游节点的输出线上。
优选的,所述的需要转化为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算子。
第二方面,基于flink框架的ETL流程组件多个不同输出的处理装置,所述基于flink框架的ETL流程组件多个不同输出的处理装置包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行所述的基于flink框架的ETL流程组件多个不同输出的处理方法。
本发明提供一种ETL流程组件存在多个不同输出时的通用处理方法,将ETL 流程组件经过拆分重组,然后翻译转换成Flink的操作算子,在Flink操作算子方法中运行重组的ETL子流程,避免重复编写Flink算子中数据处理逻辑代码,避免重复实现数据拆分的逻辑代码;根据组件在流程中的特点,尽量在一个操作算子ProcessFunction运行重组后的组件集合,避免数据在多个操作算子拆分流转,从而减少线程切换、减少延迟并提高吞吐能力。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图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流程组件多个不同输出的处理方法的在Flink框架下运行的DAG示意图;
图13是本发明实施例提供的基于flink框架的ETL流程组件多个不同输出的处理装置的装置示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例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组件可能存在多个输出端,并且每个所述输出端都可能输出不同的数据,为了避免数据在多个flink算子中拆分运行,从而增加了线程切换的压力加大延迟,因此,存在以下优选方法:
当ETL流程中存在输出节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,则所述输出节点与所述输出节点上游的Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成ETL流程子集;所述输出节点的各个输出的下游组件分别构造ETL流程子集;
由于ETL流程中的Splitting属性的节点需要调用Flink算子运算,而当 ETL流程中的节点并非Splitting属性的节点时,则无需调用Flink算子运算,由于本发明是在flink框架的ETL流程组件存在多个不同输出的情景下讨论的,因此仅讨论输出节点存在多个输出分支的情况,当ETL流程中存在输出节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,所述输出节点的下游各个分支必然都存在Flink算子的节点,而每个Flink算子的节点需要提供单独的 ProcessFunction运算,因此所述输出节点与各个输出分支内的Flink算子的节点之间都需要构成ETL流程子集,各个ETL流程子集使用对应flink API语句运算;而当ETL流程中存在输出节点为非Splitting属性的节点时,则所述 Splitting属性的节点可以与下游的输出节点一起在同一个ProcessFunction中运行,避免数据在多个操作算子拆分流转,从而减少线程切换、减少延迟并提高吞吐能力,因此存在以下优选方法:
如图1所示,流程如下:
步骤101中,判断ETL流程中一个Splitting属性的节点的节点属性为true 或者false,当所述节点属性为true时,跳转至步骤103;当所述节点属性为 false时,跳转至步骤102。
步骤102中,当ETL流程中一个Splitting属性的节点存在一个或者少于一个的输出的下游节点为Flink算子的节点时,设置所述Splitting属性的节点的节点属性FLINK_SPLITTING_NODE为false;所述输出节点上游的Splitting 属性的节点与所述输出节点下游组件的Splitting属性的节点之间所有的节点以及节点之间的连接线构成一个ETL流程子集,在flinkAPI算子 ProcessFunction中运行,所述输出节点的上游的节点与所述输出节点所有的输出线在同一个ETL子流程运行,进入步骤105。
步骤103中,当ETL流程中存在输出节点为FLINK_MESSAGE_SHARED_NODE 属性的节点时,设置所述Splitting属性的节点的节点属性 FLINK_SPLITTING_NODE为true,所述输出节点上游的Splitting属性的节点与所述输出节点之间一个或者多个ETL节点并且包括所述输出节点自身以及节点之间的连接线构造ETL流程子集,所述输出节点的各个输出的下游组件分别构造一个包含输入节点、输出线以及输出节点的ETL流程子集;所有所述ETL流程子集均在flinkAPI算子ProcessFunction中运行;其中所述输出节点对应的 ETL流程子集的flink算子的输出为所述输出线对应的下游的ETL流程子集的 flink算子的输入;所述输出节点与所述输出节点的输出线在不同的ETL子流程中运行;进入步骤104;
设置所述Splitting属性的节点的节点属性FLINK_SPLITTING_NODE为true 或者false,均为将ETL流程的节点再分配到不同的Flink操作算子中运行,不用额外人工编写输出数据按照类型拆分发送到下游组件的逻辑代码;
步骤104中,当所述Splitting属性的节点的节点属性 FLINK_SPLITTING_NODE为true时,所述Splitting属性的节点根据不同的输出数据类型配置,对输入的所有数据进行标记发送给下游算子,所述下游算子将被标记的数据还原为节点处理后的数据,根据输出数据的数据类型,将所述数据发送给对应的输出线并传递给下游节点。
其中,当设置所述节点的节点属性FLINK_SPLITTING_NODE为true;所述Splitting属性的节点同上一个属性为Splitting属性的节点组成子集;
步骤105中,当所述Splitting属性的节点的节点属性FLINK_SPLITTING_NODE为false时,所述Splitting属性的节点对输入数据进行处理,并且根据输出线对应的数据类型配置,将数据发送到对应输出节点的各自的输出线上;
其中,所述数据类型配置为正常类型数据或者异常类型数据,所述异常类型数据具体为:
由于数据多样性、不一致性导致数据处理组件无法正常处理,导致流程无法正常运行而异常停止,也无法监控、分类、统计或者分析所述数据信息,所述数据类型为异常类型数据。
如图2所示,所述将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接口,具体如下:
实施例2:
本发明实施例2提供了基于flink框架的ETL流程组件多个不同输出的处理方法,本实施例2相比实施例1在更加实际场景下来展现本方案的实施流程,本事实例中组件节点属性FLINK_SPLITTING_NODE为false。
如图3所示,图中所示ETL流程中清洗转换组件为Splitting属性节点,所述清洗转换组件输出的下游节点不存在Flink算子的节点,因此,所述清洗转换组件的节点属性FLINK_SPLITTING_NODE为false;
因此当把所述把ETL流程在Flink框架中运行时,将所述数据源节点作为Splitting属性节点在Flink算子SourceFunction中运行,所述清洗转换组件、表数据转载1组件、表数据转载2组件、表数据转载3组件、表数据转载4组件以及所述各个组件之间的连接线组成的集合在同一个Flink算子 ProcessFunction中运行。
实施例3:
本发明实施例3提供了基于flink框架的ETL流程组件多个不同输出的处理方法,本实施例3相比实施例1在更加实际场景下来展现本方案的实施流程,本事实例中组件节点属性FLINK_SPLITTING_NODE为true。
如图4所示,图中所示ETL流程中清洗转换组件为Splitting属性节点,所述清洗转换组件输出的下游节点存在Kafka sink1、Kafka sink2与Kafka sink3三个Flink算子节点,因此,所述清洗转换组件的节点属性 FLINK_SPLITTING_NODE为true;
因此当把所述把ETL流程在Flink框架中运行时,将所述数据源节点作为Splitting属性节点在Flink算子SourceFunction中运行;
所述清洗转换组件、表数据转载组件以及所述组件之间的连接线组成的ETL 子集在Flink算子ProcessFunction1中运行;
所述Flink算子ProcessFunction1向Kafka sink1发送的正常数据在由由连接线Router-正常类型组成的ETL子集中由Flink算子ProcessFunction2运行,并将运行处理得出的输出数据发送给Kafka sink1并完成装载;
所述Flink算子ProcessFunction1向Kafka sink2发送的异常数据1在由由连接线Router-异常类型1组成的ETL子集中由Flink算子ProcessFunction3 运行,并将运行处理得出的输出数据发送给Kafka sink2并完成装载;
所述Flink算子ProcessFunction1向Kafka sink3发送的正常数据在由由连接线Router-异常类型2组成的ETL子集中由Flink算子ProcessFunction4 运行,并将运行处理得出的输出数据发送给Kafka sink3并完成装载。
实施例4:
本发明实施例4提供了基于flink框架的ETL流程组件多个不同输出的处理方法,本实施例4相比实施例1在更加实际场景下来展现本方案的实施流程,具体展现正常类型数据与异常类型数据的拆分实施方法。
定义组件节点的异常类型具体如下:
DMETL元数据库存有ETL流程运行所需所有的元数据信息,用户可视化界面的形式完成流程运行的各种配置;元数据表DMETL_PROCESS_ERROR_TYPE存储管理节点错误输出信息;当配置节点错误输出时,访问元数据库 DMETL_PROCESS_ERROR_TYPE表,提供用户选择所述节点支持的异常类型,选择保存在节点属性配置表中;
一个错误输出可能包含一种或多种异常类型;元数据库表中可能没有包含所有的异常类型数据,部分异常类型数据需要在数据处理过程中不断发现,然后添加,所述用户可视化界面提供其它异常类型数据的选择,实施异常类型数据定义为其它错误;配置错误输出的同时,需要配置异常类型是否忽略异常类型的属性。
DMETL流程执行框架如图5所示,其中DMETL对数据的读取、转换并且装载的过程为数据流执行过程;
数据流中每个节点至少有一个独立线程来执行,节点之间通过FIFO同步队列的流水线传递数据;
如图5所示,ETL流程有三种类型的组件:数据读取组件、数据转换组件以及数据装载组件,所述三种类型的组件均存在异常类型数据输出的可能,需要根据应用场景来对应配置组件的异常类型输出。
节点异常输出处理的类型存在以下情景:
1、节点初始化的情景如下:
根据节点DMETL元数据库配置信息,初始化节点输出,包括正常输出normalRouters与异常输出errorRouters,异常输出包含有异常类型数据;初始化其它数据处理变量和参数。
2、节点流式处理数据的情景如下:
按照批量提交数据的具体批次进行数据处理,数据处理结果封装在对象DataProcessResult中,所述DataProcessResult对象包括数据处理前或处理后的数据消息对象,以及包含异常类型数据的异常信息。
3、DataProcessResult对象中异常信息为null时情景如下:
DataProcessResult对象中异常信息为null时,数据处理无异常,从DataProcessResult获取处理后的数据消息,发送到正常数据输出。
4、DataProcessResult中异常新信息不为null时情景如下:
DataProcessResult中异常新信息不为null时,数据处理存在异常,所述DataProcessResult对象中同时包含有异常数据以及所述异常数据的异常类型errorType;循环完毕每个errorRouters,errorRouter的异常类型errorType 与异常数据的异常类型errorType进行比较,当克隆数据消息为空,则设置消息的router为errorRouter;循环完毕每个errorRouters,当克隆数据消息不为空,则发送所有的异常消息到各自的错误输出。
5、节点异常类型设置为不予忽略情景时如下:
当节点异常类型设置为不予忽略时,抛出所述异常类型数据,所述节点运行错误,ETL流程运行停止。
以下为数据库数据装载的具体实时场景:
达梦数据库Dm7操作的异常信息,在元数据库表DMETL_PROCESS_ERROR_TYPE 中的部分记录如下:
其中,errorCode为数据库操作时抛出的异常SQLException中的errorCode,根据errorCode得到errorType。
在配置Dm7数据装载节点异常输出时,用户可视化界面上提供nodeType供 Dm7的所有errorType选择,一个错误输出可以选择多个errorType。
Dm7数据装载节点的后续输出线从所述Dm7数据装载节点已经配置好的输出线中选择,后续输出线再连接其它节点组件。
当批量提交异常数据时,回滚当前事务,所述批次数据逐个进行单一插入;当遇到异常并且所述异常数据类型忽略错误时,继续后续数据的插入;当遇到异常并且所述异常数据类型不忽略错误时,后续数据无需继续插入。
所述插入数据,无论插入成功或者失败,均需要返回每条数据的DataProcessResult的处理结果,根据DataProcessResult判断数据为异常类型数据或正确类型数据,异常数据分析异常类型,并发送数据到对应的错误输出。
当节点组件属性FLINK_SPLITTING_NODE为true时,异常类型消息增加两个属性errorType和errorInfo,所述节点的下游配置所有需要类型的消息,所述消息具体包括正常消息与异常消息,柄发送给所述节点组件的下一个Flink 操作算子;所述节点组件的下游各算子收到带标记数据后还原为组件处理后的数据DataProcessResult结果,根据输出线的数据类型的配置,发送到输出线上传递给下游组件。
实施例5:
本发明实施例5提供了基于flink框架的ETL流程组件多个不同输出的处理方法,本实施例5相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图6所示,为ETL不在Flink框架中的运行流程,本实施例中ETL流程存在一个数据源节点、三个转换节点与两个转载节点。
其中ETL流程里面的节点以及节点之间的路由线构造DAG有向无环图;
数据源节点读取数据并发送到后续转换节点1;
转换节点1读取数据并运行完成后发送给后续转换节点2与转换节点3;
转换节点2与转换节点3读取数据并运行完成后分别发送给转载节点1与转载节点2;
转载节点1与转载节点2对接收到的数据完成装载,流程运行完毕。
如图7所示,所述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算子,装载写入相应的目的。
实施例6:
本发明实施例6提供了基于flink框架的ETL流程组件多个不同输出的处理方法,本实施例6相比实施例1在更加实际场景下来展现本方案的实施流程。
如图8所示,本发明实施例是在只有一个数据源节点、无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在更加实际的场景下来展现本方案的实施流程。
如图9所示,本发明实施例是在同时存在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的算子,装载写入相应的目的。
实施例8:
本发明实施例8提供了基于flink框架的ETL流程组件多个不同输出的处理方法,本实施例8相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图10所示,本发明实施例是在同时存在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算子输出的是数据集具体的情景来展现本方案的实施流程。
如图11所示,其中,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代码使用。
具体如下:
ExecutionEnvironmentenv=
ExecutionEnvironment.getExecutionEnvironment();
DataSet sourceDataSet =env.createInput(new TableSourceInputFormat(Tablesource));
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发送给下一个算子。
实施例10:
本发明实施例10提供了基于flink框架的ETL流程组件多个不同输出的处理方法,本实施例10相比实施例1为在Flink算子输出的是数据流具体的情景来展现本方案的实施流程。
如图12所示,其中: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(new FlinkKafkaProducer(kafka sink1));
ETLProcessFunction function6-9=new ETLProcessFunction(TransformCollection6-9);
ProcessOperator operator6-9=new ProcessOperator(function6-9);
t3Stream.transform(“Process”,messageTypeInfo, operator6-9).addSink(new FlinkKafkaProducer(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发送给下一个算子。
实施例11:
如图13所示,是本发明实施例的基于flink框架的ETL流程组件多个不同输出的处理装置的装置示意图。本实施例的基于flink框架的ETL流程组件多个不同输出的处理装置包括一个或多个处理器21以及存储器22。其中,图9中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图9中以通过总线连接为例。
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例1中的基于flink框架的ETL 流程组件多个不同输出的处理方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行基于flink框架的ETL流程组件多个不同输出的处理方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的基于flink框架的ETL流程组件多个不同输出的处理方法,例如,执行以上描述的图1-图12所示的各个步骤。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
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属性的节点与需要转化为Flink算子的节点中的一个或者多个设置为Splitting属性的节点;
当ETL流程中存在输出节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,则所述输出节点与所述输出节点上游的Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成ETL流程子集;所述输出节点的两个或者两个以上数量的分支的输出的下游组件分别构造对应的两个或者两个以上数目的ETL流程子集;
当ETL流程中存在输出节点为非Splitting属性的节点时,所述输出节点上游的Splitting属性的节点与所述输出节点下游的Splitting属性的节点之间的一个或者多个ETL节点以及节点之间的连接线构成ETL流程子集;
所有所述ETL流程子集构造对应的flink API语句并进行运行处理。
2.根据权利要求1所述的基于flink框架的ETL流程组件多个不同输出的处理方法,其特征在于,当ETL流程中存在输出节点为FLINK_MESSAGE_SHARED_NODE属性的节点时,则设置所述输出节点属性FLINK_SPLITTING_NODE为true;
当ETL流程中存在输出节点为非Splitting属性的节点时,则设置所述输出节点属性FLINK_SPLITTING_NODE为false。
3.根据权利要求2所述的基于flink框架的ETL流程组件多个不同输出的处理方法,其特征在于,当所述输出节点属性FLINK_SPLITTING_NODE为true时,所述输出节点上游的Splitting属性的节点与所述输出节点之间一个或者多个ETL节点并且包括所述输出节点自身以及节点之间的连接线构造ETL流程子集,所述输出节点的各个输出以及输出的下游组件截止到Splitting属性的节点之间所有的节点以及节点之间的连接线构成一个ETL流程子集;所有所述ETL流程子集均在flinkAPI算子ProcessFunction中运行;其中所述输出节点对应的ETL流程子集的flink算子的输出为所述输出线对应的下游的ETL流程子集的flink算子的输入;
当输出节点属性FLINK_SPLITTING_NODE为false时,所述输出节点上游的Splitting属性的节点与所述输出节点下游组件的Splitting属性的节点之间所有的节点以及节点之间的连接线构成一个ETL流程子集,在flinkAPI算子ProcessFunction中运行。
4.根据权利要求2所述的基于flink框架的ETL流程组件多个不同输出的处理方法,其特征在于,节点属性FLINK_SPLITTING_NODE为true时,所述节点根据不同的输出配置,对输入的数据进行处理并标记发送给下游算子,所述下游算子将带标记的数据还原为节点处理后的数据,将数据发送给对应的输出线并传递给下游节点。
5.根据权利要求2所述的基于flink框架的ETL流程组件多个不同输出的处理方法,其特征在于,节点属性FLINK_SPLITTING_NODE为false时,所述节点对输入数据进行处理,并且根据输出线的数据类型配置,直接将数据发送到各自对应的下游节点的输出线上。
6.根据权利要求1所述的基于flink框架的ETL流程组件多个不同输出的处理方法,其特征在于,所述的需要转化为Flink算子的节点具体包括FLINK_REDUCE_NODE属性的节点与FLINK_CONNECTOR_NODE属性的节点;
搜索出ETL流程中所有的需要转化为Flink算子的节点,所述节点的上游一直到数据源节点的路由线设置为FLINK_MESSAGE_SHARED_ROUTER属性。
7.根据权利要求6所述的基于flink框架的ETL流程组件多个不同输出的处理方法,其特征在于,数据源节点开始,如果节点存在至少两个分支路由线,并且有至少两个分支路由线被设置为FLINK_MESSAGE_SHARED_ROUTER属性,则所述节点为FLINK_MESSAGE_SHARED_NODE属性的节点,设置FLINK_MESSAGE_SHARED_NODE属性;
其中需要转化为Flink算子的节点不设置为FLINK_MESSAGE_SHARED_NODE节点。
8.根据权利要求1所述的基于flink框架的ETL流程组件多个不同输出的处理方法,其特征在于,以相邻的两个所述Splitting属性的节点作为依据,生成由相邻的两个所述Splitting属性的节点之间的一个或者多个ETL节点构成的子集。
9.根据权利要求8所述的基于flink框架的ETL流程组件多个不同输出的处理方法,其特征在于,所述Flink算子被调用时,构造所述ETL流程子集的DAG并运行;所述相邻Splitting属性的节点之间构造一条flink API操作算子链,所述相邻Splitting属性的节点中的前一个Splitting属性的节点对应的flink算子的输出数据流或数据集作为所述flink API操作算子链的输入,所述flink API操作算子链的输入后续构造一个使用所述ETL流程子集的Flink算子。
10.基于flink框架的ETL流程组件多个不同输出的处理装置,其特征在于,基于flink框架的ETL流程组件多个不同输出的处理装置包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行权利要求1-9任一所述的基于flink框架的ETL流程组件多个不同输出的处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111642588.7A CN114385140B (zh) | 2021-12-29 | 2021-12-29 | 基于flink框架的ETL流程组件多个不同输出的处理方法与装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111642588.7A CN114385140B (zh) | 2021-12-29 | 2021-12-29 | 基于flink框架的ETL流程组件多个不同输出的处理方法与装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114385140A CN114385140A (zh) | 2022-04-22 |
CN114385140B true CN114385140B (zh) | 2023-03-24 |
Family
ID=81199666
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111642588.7A Active CN114385140B (zh) | 2021-12-29 | 2021-12-29 | 基于flink框架的ETL流程组件多个不同输出的处理方法与装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114385140B (zh) |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180203744A1 (en) * | 2017-01-09 | 2018-07-19 | Alexander WIESMAIER | Data ingestion and analytics platform with systems, methods and computer program products useful in conjunction therewith |
US11637831B2 (en) * | 2019-10-09 | 2023-04-25 | Salesforce, Inc. | Application programmer interface platform with direct data center access |
CN110851514B (zh) * | 2019-10-17 | 2022-10-21 | 杭州安恒信息技术股份有限公司 | 基于flink的etl处理方法 |
CN111241078A (zh) * | 2020-01-07 | 2020-06-05 | 网易(杭州)网络有限公司 | 数据分析系统、数据分析的方法及装置 |
CN113360554B (zh) * | 2020-03-06 | 2023-06-23 | 深圳法大大网络科技有限公司 | 一种数据抽取、转换和加载etl的方法和设备 |
CN111666296A (zh) * | 2020-04-28 | 2020-09-15 | 中国平安财产保险股份有限公司 | 基于Flink的SQL数据实时处理方法、装置、计算机设备和介质 |
CN112287007B (zh) * | 2020-10-30 | 2022-02-11 | 常州微亿智造科技有限公司 | 基于Flink SQL引擎的工业生产数据实时处理方法、系统 |
CN112667719A (zh) * | 2020-12-27 | 2021-04-16 | 武汉达梦数据库股份有限公司 | 一种hadoop集群运行ETL的流程分解方法与装置 |
CN113111131B (zh) * | 2021-04-30 | 2022-07-08 | 苏州科达科技股份有限公司 | 基于Flink实现Neo4j数据同步的方法及系统、集成方法及装置 |
CN113240341A (zh) * | 2021-06-10 | 2021-08-10 | 中国人民解放军战略支援部队航天工程大学 | 一种基于大数据的信息系统效能评估方法 |
-
2021
- 2021-12-29 CN CN202111642588.7A patent/CN114385140B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN114385140A (zh) | 2022-04-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11016673B2 (en) | Optimizing serverless computing using a distributed computing framework | |
Kershenbaum et al. | Centralized teleprocessing network design | |
Yuang | Survey of protocol verification techniques based on finite state machine models | |
US11252076B2 (en) | Data forwarding method and apparatus | |
CN111355696A (zh) | 一种报文识别方法、装置、dpi设备及存储介质 | |
CN113900810A (zh) | 分布式图处理方法、系统及存储介质 | |
US7774769B2 (en) | Transmitting trace-specific information in a transformed application | |
CN114385136B (zh) | 一种Flink框架运行ETL的流程分解方法和装置 | |
Sampath et al. | An efficient weighted rule mining for web logs using systolic tree | |
CN114385140B (zh) | 基于flink框架的ETL流程组件多个不同输出的处理方法与装置 | |
US9880923B2 (en) | Model checking device for distributed environment model, model checking method for distributed environment model, and medium | |
West | Protocol validation—principles and applications | |
US20140351677A1 (en) | Minimum cut set evaluation system, minimum cut set calculation method, and program | |
CN106878171B (zh) | 一种用于多数据源的流式数据处理方法及装置 | |
CN114385138B (zh) | 一种Flink框架运行ETL的流程联合组件方法和装置 | |
CN114385139B (zh) | 一种flink框架运行ETL流程的消息序列化以及比较方法与装置 | |
JPH02195461A (ja) | Cpuベースの階層的通信システムにおいてタイ及びタイ・グループの保全制を維持するための方法 | |
CN112799673B (zh) | 一种网络协议数据的校核方法及装置 | |
CN115168434A (zh) | 一种共享存储集群数据库的数据同步方法及设备 | |
CN113835712A (zh) | 一种按照给定字段值进行判断的快速数据包分组路由方法 | |
CN114385137B (zh) | 一种Flink框架运行ETL的流程方法和装置 | |
US10067816B2 (en) | Model checking apparatus and method, and storage medium having program stored therein | |
RU2490702C1 (ru) | Способ ускорения обработки множественных запросов типа select к rdf базе данных с помощью графического процессора | |
Nanz et al. | Topology-dependent abstractions of broadcast networks | |
CN115185543B (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 |