CN114385139B - 一种flink框架运行ETL流程的消息序列化以及比较方法与装置 - Google Patents
一种flink框架运行ETL流程的消息序列化以及比较方法与装置 Download PDFInfo
- Publication number
- CN114385139B CN114385139B CN202111642576.4A CN202111642576A CN114385139B CN 114385139 B CN114385139 B CN 114385139B CN 202111642576 A CN202111642576 A CN 202111642576A CN 114385139 B CN114385139 B CN 114385139B
- Authority
- CN
- China
- Prior art keywords
- flink
- data
- operator
- etl
- message
- 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
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框架中运行的基础上,通过定义MessageTypeInfo,完成flink算子的输出数据的序列化与输入数据的反序列化,并实现flink接口来自定义flink框架中消息数据的排序比较的逻辑解决了Binary、CLob、Blob、Geometry数据类型无法利用Flink自带的TypeInformation进行序列化和反序列化的问题,并解决了排序算子处理自定义复杂排序数据的序列化、比较的问题,极大减少序列化后数据的冗余,提升序列化和比较的性能。
Description
【技术领域】
本发明涉及数据处理技术领域,特别是涉及一种flink框架运行ETL流程的消息序列化以及比较方法与装置。
【背景技术】
ETL是数据处理、构建数据仓库的一个重要工具软件,它完成异构数据源的抽取、清洗转换,然后加载的一个过程。传统的ETL一般是把流程发布到一个集中的ETL服务器节点上运行,所有的流程或流程内组件的运行采用多线程机制,再多的流程也只能在一个单一节点运行,并且一个大数据的处理流程,也无法提高数据处理的性能。
Flink大数据平台在大数据处理中已经取得相当广泛的应用,是一个分布式处理引擎框架,用于对无界和有界数据流进行有状态计算,具备极高的故障恢复性能和容错性能。
如果ETL流程能够提交到Flink框架运行,可以极大提高流程并发执行能力,并且可以充分利用流式处理的有状态计算来提高流程运行稳定可靠性,同时支持流式处理以及高吞吐和低延迟。
ETL流程分解为flink的算子任务提交到flink框架执行,这些算子可能运行在不同的TaskManager,在不同jvm之间传递数据消息Message,消息Message必须经过序列化和反序列化,才能在不同的节点TaskManager传输。
但是,ETL消息Message的序列化以及消息的比较存在以下局限性以及性能上的制约:
ETL消息Message封装了数据、消息类型、错误消息的错误类型以及时间戳等信息,数据的类型包括基本的数据类型、二进制Binary、大对象数据类型CLob和Blob、空间数据类型Geometry等。Binary、CLob、Blob、Geometry数据类型显然无法利用Flink自带的TypeInformation进行序列化和反序列化;对于排序算子、连接算子等需要使用KeySelector的算子,需要自定义自己的KeySelector的算子以及KEY消息KeyMessage、KeyMessageTypeInfo;不管是Flink自带的PojoTypeInfo还是GenericTypeInfo,序列化后都会附带大量的元数据信息,从而影响数据类型在序列化和比较时的性能。Message以及KeyMessage的系列化仅仅系列化数据,不保存数据类型等元数据信息。
ETL流程提交到flink框架运行,极大地提高了流程并发处理能力,同时支持流式处理以及高吞吐和低延迟。ETL流程分解为flink的算子任务提交到flink框架执行,这些算子可能运行在不同的TaskManager,在不同jvm之间传递数据消息Message,消息Message必须经过序列化和反序列化,才能在不同的节点TaskManager传输。Flink在其内部构建了一套自己的类型系统,Flink支持的类型可以分为基础类型(Basic)、数组(Arrays)、复合类型(Composite)、辅助类型(Auxiliary)、泛型和其它类型(Generic)。Flink中用TypeInformation作为类型描述符来表示每一种要表示的数据类型。在Flink中每一个具体的类型都对应了一个具体的TypeInformation实现类,例如BasicTypeInformation中的IntegerTypeInformation和FractionalTypeInformation都具体的对应了一个TypeInformation。然后还有BasicArrayTypeInformation、CompositeType以及一些其它类型,也都具体对应了一个TypeInformation。TypeInformation会提供一个createSerialize()方法,通过这个方法就可以得到该类型进行数据序列化操作与反序化操作的对象TypeSerializer;TypeInformation还会提供createComparator方法,通过这个方法可以得到用于KEY比较TypeComparator。
但是,ETL消息Message的序列化以及消息的比较存在以下局限性以及性能上的制约:
ETL消息Message封装了数据、消息类型、错误消息的错误类型以及时间戳等信息,数据的类型包括基本的数据类型、二进制Binary、大对象数据类型CLob和Blob、空间数据类型Geometry等。Binary、CLob、Blob、Geometry数据类型显然无法利用Flink自带的TypeInformation进行序列化和发序列化,需要自定义MessageTypeInfo;
对于排序算子、连接算子等需要使用KeySelector的算子,需要自定义自己的KeySelector的算子以及KEY消息KeyMessage、KeyMessageTypeInfo。比如排序算子需要自定义待排序数据SortKeyMessage对应的TypeInformation、TypeSerializer以及TypeComparator;
flink自带序列化的效率问题。不管是Flink自带的PojoTypeInfo还是GenericTypeInfo,序列化后都会附带大量的元数据信息,从而影响数据类型在序列化和比较时的性能。Message以及KeyMessage的系列化仅仅系列化数据,不保存数据类型等元数据信息。
鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。
【发明内容】
本发明要解决的技术问题是提供一种flink框架运行ETL流程的消息序列化以及比较方法。
本发明进一步要解决的技术问题是提供一种flink框架运行ETL流程的消息序列化以及比较装置。
本发明采用如下技术方案:
第一方面,一种Flink框架运行ETL的流程的消息序列化以及比较方法和装置,流程分解方法包括:
ETL流程分解为flink的算子任务提交到flink框架执行,其中一个或者多个ETL节点以及节点之间的连接线构成ETL流程子集,并通过一个Flink算子运行所述ETL流程子集;
定义MessageTypeInfo,所述子集的Flink算子调用MessageTypeInfo将所述ETL流程子集的flink算子的输出数据进行序列化并发送给下游子集的flink算子,所述下游ETL流程子集的Flink算子调用所述MessageTypeInfo对接收到的数据进行反序列化,所述被反序列化的数据作为所述下游子集的Flink算子的输入数据,进行数据处理;
实现flink接口来自定义flink框架中消息数据的排序比较的逻辑。
优选的,所述定义MessageTypeInfo,具体包括:
MessageTypeInfo派生于Flink内置的TypeInformation,重构实现createSerializer,所述createSerializer返回MessageSerializer,MessageSerializer重构实现serialize与deserialize,所述serialize调用定义的LazyBinarySerializer序列化上游ETL流程子集的输出消息发送给下游ETL流程子集的flink算子,所述deserialize调用定义的LazyBinaryDeSerializer反序列化下游ETL流程子集的flink算子接收到的输入消息。
优选的,所述定义的LazyBinarySerializer,具体包括:
定义DataType对应消息的数据类型;
根据能够利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinarySerializer将所述数据类型中的数据Object[]data序列化为字节数组byte[];
根据无法利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinarySerializer将所述数据类型自定义序列化为字节数组byte[]。
优选的,定义DataType对应消息的数据类型包括:String、Boolean、Integer、Byte、Short、Long、Float、Double、Decimal、Date、Time、DateTime、Binary、Clob、Blob、Geometry、Object中的一个或者多个;
其中,所述所述无法利用Flink自带的TypeInformation进行序列化和反序列化的数据类型具体包括:Binary、CLob、Blob、Geometry中的一个或者多个。
优选的,所述定义的LazyBinaryDeSerializer,具体包括:
根据能够利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinaryDeSerializer将所述数据类型反序列化为数据Object[]data;
根据无法利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinaryDeSerializer将所述数据类型自定义反序列化,其中,数据类型Binary反序列化为byte[],数据类型CLob反序列化为DMETLClob,数据类型Blob反序列化为DMETLBlob,数据类型Geometry反序列化为Geometry对象。
优选的,所述实现flink接口来自定义flink框架中消息数据的排序比较的逻辑,具体包括:
重构实现flink的KeySelector接口,重定义所述flink的getKey方法获取消息数据中的待排序字段数据SortMessage,并定义针对SortMessage的SortMessageTypeInfo;重构实现createComparator,所述createComparator定义SortMessageComparator来实现待排序字段SortMessage的比较功能。
优选的,所述定义SortMessageComparator来实现待排序字段SortMessage的比较功能,具体包括:
定义SortMessage的比较方法类SortUtil,SortUtil定义两个SortMessage的比较方法compare,所述compare方法根据待排序消息的字段类型与排序规则进行字段值的比较,获取比较结果。
优选的,所述compare方法根据待排序消息的字段类型与排序规则进行字段值的比较,具体包括:
所述待排序字段类型包括字符串类、数字类、日期时间类中的一个或者多个,所述字段类实现Comparable接口;如果待排序字段为非字符串类型,则使用所述Comparable接口的compareTo进行字段值比较,获取比较结果;
所述排序规则,对于字符串String类型字段,如果排序规则是根据中文拼音排序,则使用com.ibm.icu.text.Collator进行字段值的比较,获取比较结果;如果排序规则是根据字符编码排序,则编码的字节数组进行比较,获取比较结果。
优选的,所述一个或者多个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框架运行ETL流程的消息序列化以及比较装置,其特征在于,flink框架运行ETL流程的消息序列化以及比较装置包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行所述的flink框架运行ETL流程的消息序列化以及比较方法。
本发明解决了Binary、CLob、Blob、Geometry数据类型无法利用Flink自带的TypeInformation进行序列化和反序列化的问题,并解决了排序算子处理自定义复杂排序数据的序列化、比较的问题,极大减少序列化后数据的冗余,提升序列化和比较的性能。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的流程示意图;
图2是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的流程示意图;
图3是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的DAG示意图;
图4是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的DAG示意图;
图5是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的DAG示意图;
图6是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的DAG示意图;
图7是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的DAG示意图;
图8是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的DAG示意图;
图9是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较方法的DAG示意图;
图10是本发明实施例提供的一种flink框架运行ETL流程的消息序列化以及比较装置的装置示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
本发明实施例1提供了一种flink框架运行ETL流程的消息序列化以及比较方法。
一种flink框架运行ETL流程的消息序列化以及比较方法,流程包括:
如图1所示,流程如下:
步骤101中,ETL流程分解为flink的算子任务提交到flink框架执行,其中一个或者多个ETL节点以及节点之间的连接线构成ETL流程子集,并通过一个Flink算子运行所述ETL流程子集;
遍历ETL的有向无环图DAG,识别出一个或者多个Splitting属性的节点;由于在以Flink框架运行ETL流程的方法中,需要根据ETL组件节点集合构造Flink API语句,而一条Flink API语句使用一个或多个输入,一个输出,需要将两个FLINK_SPLITTING_NODE之间组件集合运行在Flink算子里面。
ETL流程分解为flink的算子任务提交到flink框架执行,所述flink算子在不同的TaskManager上运行,其中,上游子集的flink算子将数据发送给下游子集的flink时,所述数据消息需要序列化,下游子集的Flink算子接收来自上游子集的Flink算子的数据时,所述数据消息需要反序列化,因此存在以下优选方法:
步骤102中,定义MessageTypeInfo,所述子集的Flink算子调用MessageTypeInfo将所述ETL流程子集的flink算子的输出数据进行序列化并发送给下游子集的flink算子;
步骤103中,所述下游ETL流程子集的Flink算子调用所述MessageTypeInfo对接收到的数据进行反序列化,所述被反序列化的数据作为所述下游子集的Flink算子的输入数据,进行数据处理;
ETL流程分解出Flink操作算子,所述Flink操作算子传入MessageTypeInfo对象,具体的,上游子集的Flink操作作算子调用MessageTypeInfo中的MessageSerializer的serialize进行输出数据的序列化,下游子集的Flink操作算子调用MessageTypeInfo中的MessageSerializer的deserialize进行输入数据的反序列化,反序列化后的Message作为该算子的输入,然后进行数据处理。
在flink框架中消息数据的排序比较中如果排序规则使用中文排序稍显复杂,如果依靠Flink内置的排序功能无法实现要求,因此还存在以下优选方法:
步骤104中,实现flink接口来自定义flink框架中消息数据的排序比较的逻辑。
所述排序为基于消息中的字段大小比较,按照得出的比较顺序输出消息。
本发明解决了Binary、CLob、Blob、Geometry数据类型无法利用Flink自带的TypeInformation进行序列化和反序列化的问题,并解决了排序算子处理自定义复杂排序数据的序列化、比较的问题,极大减少序列化后数据的冗余,提升序列化和比较的性能。
在依靠Flink自带的TypeInformation将消息数据进行序列化和反序列化的过程中,存在部分数据类型无法利用Flink自带的TypeInformation将进行序列化和反序列化,因此还存在以下优选方法:
MessageTypeInfo派生于Flink内置的TypeInformation,重构实现createSerializer,所述createSerializer返回MessageSerializer,MessageSerializer重构实现serialize与deserialize,所述serialize调用定义的LazyBinarySerializer序列化上游ETL流程子集的输出消息发送给下游ETL流程子集的flink算子,所述deserialize调用定义的LazyBinaryDeSerializer反序列化下游ETL流程子集的flink算子接收到的输入消息。
在Flink中每一个具体的类型都对应了一个具体的TypeInformation实现类,其中BasicTypeInformation中的IntegerTypeInformation和FractionalTypeInformation都具体的对应了一个TypeInformation;BasicArrayTypeInformation、CompositeType均一一对应了一个TypeInformation。
定义DataType对应消息的数据类型;
所述DataType对应类型包括String、Boolean、Integer、Byte、Short、Long、Float、Double、Decimal、Date、Time、DateTime、Binary、Clob、Blob、Geometry与Object,定义ColumnBean为ETL子集输出数据列信息,ColumnBean设置字段类型DataType,所述ETL子集输出数据与ColumnBean[]的数据类型DataType一一对应。
其中,所述serialize调用定义的LazyBinarySerializer序列化子集发送的输出消息,具体包括:
根据能够利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinarySerializer将所述数据类型中的数据Object[]data序列化为字节数组byte[];
根据无法利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinarySerializer将所述数据类型自定义序列化为字节数组byte[]。
LazyBinarySerializer序列化过程中,无需将列信息等数据信息进行保存,而不管是Flink自带的PojoTypeInfo还是GenericTypeInfo,序列化后都会保存大量数据信息,从而影响数据类型在序列化和比较时的性能,因此极大减少序列化后数据的冗余,提升序列化和比较的性能;针对Flink无法序列化的Binary、CLob、Blob、Geometry数据类型,可以在LazyBinarySerializer中专门实现自定义的序列化,将所述数据类型中的数据转换为字节数组byte[]。
其中,所述serialize调用定义的LazyBinaryDeSerializer反序列化子集接收到的输入消息,具体包括:
根据能够利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinaryDeSerializer将所述数据类型反序列化为数据Object[]data;
根据无法利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinaryDeSerializer将所述数据类型自定义反序列化,其中,数据类型Binary反序列化为byte[],数据类型CLob反序列化为DMETLClob,数据类型Blob反序列化为DMETLBlob,数据类型Geometry反序列化为Geometry对象。
对于部分需要使用KeySelector的算子,需要自定义所述算子的KeySelector的算子以及KEY消息KeyMessage、KeyMessageTypeInfo,从而解决排序算子处理自定义复杂排序数据的序列化、比较问题,因此还存在以下优选方案:
所述实现flink接口来自定义flink框架中待排序消息的排序比较的逻辑,具体包括:
重构实现flink的KeySelector接口,重定义所述flink的getKey方法获取消息数据中的待排序字段数据SortMessage,并定义针对SortMessage的SortMessageTypeInfo;重构实现createComparator,所述createComparator定义SortMessageComparator来实现待排序字段SortMessage的比较功能。
定义SortMessage的比较方法类SortUtil,SortUtil定义两个SortMessage的比较方法compare,所述compare方法根据待排序消息的字段类型与排序规则进行字节数组的比较,获取比较结果。
其中,所述待排序消息的字段类型包括:排序算子处理自定义复杂排序数据的序列化、比较问题;待排序消息的排序规则包括:
所述待排序字段类型包括字符串类、数字类、日期时间类中的一个或者多个,所述字段类实现Comparable接口;如果待排序字段为非字符串类型,则使用所述Comparable接口的compareTo进行字节数组的比较,获取比较结果;
所述排序规则,对于字符串String类型字段,如果排序规则是根据中文拼音排序,则使用com.ibm.icu.text.Collator进行字节数组的排序,获取比较结果;如果排序规则是根据字符编码排序,则编码的字节数组进行对应,然后进行字节数组的比较,获取比较结果。
重构实现createComparator来定义SortMessageComparator,实现待排序字段的比较功能,所述SortMessageComparator根据自定义排序规则进行比较。
ETL流程分解为flink的算子任务提交到flink框架执行,具体包括:
遍历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属性的节点,存在以下优选方法:
如图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接口,具体如下:
实施例2:
本发明实施例2提供了一种flink框架运行ETL流程的消息序列化以及比较方法,本实施例2相比实施例1在更加实际的场景下来展现本方案的实施流程。
定义ETL组件之间数据传输消息Message,组件接收到上游组件数据消息,进行数据处理,然后转换成另一个消息Message发送给下游组件;Message为单条记录数据的封装,包括各个字段数据数组、错误消息的消息描述以及类型、时间戳、消息类型等信息。
所述Message数据结构为:Message{type,data,timestamp,errorType,errorInfo}。
定义DataType对应消息Message里面各个数据字段类型;
所述DataType对应类型包括String、Boolean、Integer、Byte、Short、Long、Float、Double、Decimal、Date、Time、DateTime、Binary、Clob、Blob、Geometry以及未知类型Object。
定义ColumnBean为ETL组件输出数据列信息,所述ColumnBean设置字段类型DataType,组件输出数据与ColumnBean[]的数据类型DataType一一对应,所述ColumnBean数据结构为:ColumnBean{name,dataType}。
所述Message数据的类型包括基本的数据类型、二进制Binary、大对象数据类型CLob和Blob、空间数据类型Geometry等;其中Binary、CLob、Blob余Geometry数据类型显然无法利用Flink自带的基本TypeInformation进行序列化和反序列化,自定义MessageTypeInfo,供flink操作算子使用。
定义LazyBinarySerializer实现消息Message的序列化;根据指定的列类型DataType,序列化Message中的数据Object[]data为字节数组byte[]。
所述LazyBinarySerializer序列化过程中,列信息等元数据信息不保存;针对Flink无法序列化的Binary、CLob、Blob、Geometry数据类型,可以在LazyBinarySerializer中专门实现自定义的序列化,转换为字节数组byte[]。
存储各个字段的字节序列数组。
每8个字段使用一个字节的8位来标志这8个字段是否为NULL值;所述字节放在这8个字段数据区的前一个字节,当字段为NULL时,则字段对应的位为0,否则为1,数据区域只写入非NULL字段的字节数组。
以下为各种类型字段序列化为二进制字节数组方法:
字段值为value时,方法如下:
1、Boolean;
当Value值为真时,则转为字节1,否则转为0。
2、String;
获取value的UTF-8编码的字节数组;通过zero-compressed encoded的变长编码算法获得数组长度的字节数组,长度的字节数组以及本身的字节数组构成所述类型字段序列化后的字节序列数组。
3、Integer;
通过zero-compressed encoded的变长编码算法获得value的字节数组,即为序列化后的字节序列数组。
4、Byte;
Byte为一个字节,因此序列化就是本身。
5、Short;
Short本身有两个字节,序列化为由所述两个字节组成的字节数组。
6、Long;
通过zero-compressed encoded的变长编码算法获得value的字节数组,即为序列化后的字节序列数组。
7、Float;
通过Float.floatToIntBits(value)函数获得value的int值,通过zero-compressed encoded的变长编码算法获取所述int值的字节数组,即为序列化后的字节序列数组。
8、Double;
通过Double.doubleToLongBits(value)函数获得value的long值,通过zero-compressed encoded的变长编码算法获取所述long值的字节数组,即为序列化后的字节序列数组。
9、Decimal;
Byte[]internalStorage=value.unscaledVaue.toByteArray();
Int scale=value.scale;
Scale的变长字节数组、internalStorage长度的变长字节数组、internalStorage本身的字节数组,组成value序列化后的字节序列数组。
10、Date;
获取value的epoch的int值,所述int值的变长字节数组为value序列化后的字节序列数组。
11、Time;
通过Value.getTime()函数获取epoch millionseconds long值,所述long值的变长字节数组为value序列化后的字节数组。
12、DataTime;
Value.getTime()函数获取epoch millionseconds long值,所述long值的变长字节数组、value.getNanos()%1000000int值,所述int值的变长字节数组,组成value序列化后的字节序列数组。
13、Binary;
通过zero-compressed encoded的变长编码算法获得value字节数组长度的字节数组,长度的字节数组以及本身value的字节数组为该字段序列化后的二进制值。
14、Clob;
获取value的String对象,获取value的UTF-8编码的字节数组;通过zero-compressed encoded的变长编码算法获得数组长度的字节数组,长度的字节数组以及本身的字节数组构成所述类型字段序列化后的字节序列数组。
15、Blob;
通过value.getBytes获取对象的字节数组,通过zero-compressed encoded的变长编码算法获得value字节数组长度的字节数组,长度的字节数组以及本身value的字节数组为该字段序列化后的二进制值。
16、Geometry;
Geometry对象为标准的空间对象org.locationtech.jts.geom.Geometry。通过Geotools提供的WKBWriter转换Geometry对象为二进制字节序列数组,通过zero-compressed encoded的变长编码算法获得value字节数组长度的字节数组,长度的字节数组以及本身value的字节数组为该字段序列化后的二进制值。反序列化时,使用WKBReader转换字节数组为Geometry对象。
其它未知对象使用Kryo进行序列化和反序列化。
上述列出了各种类型字段的比较紧凑的序列化方法,按照逆向思路,反序列化时进行相对应字节序列数组的反序列化,转化为各自对应的字段对象;Int与long数值通过zero-compressed encoded的变长编码算法获取字节序列数组,反序列化时通过zero-compressed encoded提供的反序列化算法,反序列化出对应的Int与long数值。
定义LazyBinaryDeSerializer实现消息Message的反序列化;根据指定的列类型DataType反序列化列数据Object[]data,然后封装成消息Message;所述Binary、CLob、Blob、Geometry数据类型反序列化各自对应的数据类型;其中,所述Binary对应为byte[],所述CLob对应为DMETLClob,所述Blob对应反序列化为DMETLBlob,所述Geometry类型转成标准的Geometry对象。
上述实现了自定义的序列化LazyBinarySerializer与反序列化LazyBinaryDeSerializer,需要实现flink提供的接口,来应用使用到flink框架中进行Message的序列化与反序列化。
定义MessageSerializer实现flink提供的TypeSerializerSingleton。
所述ETL部分清洗转换与装载组件存在错误数据输出,存在以下几种比较典型的错误数据处理:
数据不适合清洗转换规则,如果转换规则转字符串为int整数,当所述字段数据为非数字字符串,则定义为错误数据;
其中hbase装载仅装载无符号整数,带符号数据属于错误数据;
关系数据库表装载,可能存在违反唯一性错误、非空等错误,所述数据无法装载入库,也称为错误数据。
对于所述带有错误信息的Message,当对所述带有错误信息的Message进行序列化时,需要对错误类型与具体错误信息进行相应的序列化和反序列化处理,否则导致所述ETL组件无法正确处理错误输出。
具体实施过程中,对被序列化的数据进行错误数据处理时,构造序列化MessageSerializer对象,构造函数增加参数withErrorType为true;所述MessageSerializer对象均需要带上Message列信息columnBeans,供序列化和反序列化获取每个字段的类型DataType使用;具体如下:
MessageTypeInfo在具体算子中使用方式如下:
DataStream API:
MessagetypeInfo messageTypeInfo=new MessageTypeInfo(outputColumns,false);
ETLProcessFunction function=new
ETLProcessFunction(TransformCollection);
ProcessOperator operator=new ProcessOperator(function);
DataStrean stream=sourceStream.transform(“Process”,messageTypeInfo,operator);
所述transform算子输出的数据经过messageTypeInfo提供的自定义序列化进行Message的序列化,下一个算子接收到序列化后的数据后,使用所述messageTypeInfo进行反序列化,还原得到Message,具体如下:
DataSet API:
MessagetypeInfo messageTypeInfo=new MessageTypeInfo(outputColumns,false);
ETLDataSetProcessFunction function=new
ETLDataSetProcessFunction(TransformCollection);
DataStrean dataSet=
sourceDataSet.flatMap(function).returns(messageTypeInfo);
同样,所述flatMap算子输出的数据经过messageTypeInfo提供的自定义序列化进行Message的序列化,然后下一个算子接收到序列化后的数据后,使用该messageTypeInfo进行反序列化,还原得到Message。
实施例3:
本发明实施例3提供了一种flink框架运行ETL流程的消息序列化以及比较方法,本实施例3相比实施例1在更加实际的场景下来展现本方案的实施流程。
Flink提供基本类型字段的简单比较排序,对于中文字段的排序,其中汉字的基于拼音规则的排序,flink提供的简单操作算子无法实现;因此需要实现flink接口来自定义排序比较的逻辑,才能输出希望得到的排序结果。
定义SortMessage封装待排序的字段数据,可能存在一个或多个字段,具体如下:
SortMessage
{
Public Object[]data;
}
自定义SortMessage的比较方法类SortUtil,所述SortUtil定义两个SortMessage的比较方法compare,所述Compare方法根据待排序字段类型与排序规则,其中所述排序规则为String类型字段的中文拼音规则排序与基于某种字符编码的二进制排序;一般待排序字段类型一般为字符串类型、数字类型与日期时间类型,所述待排序字段类型一般均实现Comparable。
所述flink接口与非字符串类型,使用所述对象的compareTo进行比较;其中,对于字符串String类型字段,根据定义的排序规则,当是所述定义的排序规则为基于中文拼音排序时,使用com.ibm.icu.text.Collator进行排序;当是所述定义的排序规则为基于某种字符编码的排序时,首先对应编码的字节数组,然后进行字节数组的比较,获取比较结果。
自定义SortMessageComparator实现flink的TypeCompatator,进行SortMessage大小的比较,具体如下:
所述SortMessage可能在flink不同的NodeManager传输,也需要与Message一样定义自己的序列化机制,具体如下:
Flink排序算子根据设置的待排序SortMessage的TypeInformation。定义SortMessageTypeInfo,获取SortMessage的SortMessageSerializer以及SortMessageComparator。
带排序的字段可能是一个或多个,自定义SortSelector实现flink提供的KeySelector接口,从一个数据Message中提出SortMessage。
上述步骤完成后,按照如下方式定会排序相关算子语句,具体如下:
TypeInformation<SortMessage>keyType=newSortMessageTypeInfo(sortolumns,InputColumns);
KeySelector<Message,SortMessage>keyExtractor=newSortSelector(sortColumnsIndexes);
SelectorFunctionKeys keys=newSelectorFunctionKeys<>(keyExtractor,sourceDataSet.getType(),keyType);
SortPartitionOperator<Message>sortDataSet=newSortPartitionOperator(sourceDataSet,keys,Order.ASCENDING,“customsort”)
sortDataSet接一个flatMap就可以把排序后有顺序的数据输出到目的,比如文件。
ETLDataSetProcessFunction functionFileSink=newETLDataSetProcessFunction(TransformFileSinkCollection);
sortDataSet.flatMap(functionFileSink).returns(messageTypeInfo).;
实施例4:
本发明实施例4提供了一种flink框架运行ETL流程的消息序列化以及比较方法,本实施例4相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图3所示,本实施例中ETL流程存在一个数据源节点、三个转换节点与两个转载节点。
其中ETL流程里面的节点以及节点之间的路由线构造DAG有向无环图;
数据源节点读取数据并发送到后续转换节点1;
转换节点1读取数据并运行完成后发送给后续转换节点2与转换节点3;
转换节点2与转换节点3读取数据并运行完成后分别发送给转载节点1与转载节点2;
转载节点1与转载节点2对接收到的数据完成装载,流程运行完毕。
如图4所示,流程提交到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算子,装载写入相应的目的。
实施例5:
本发明实施例5提供了一种flink框架运行ETL流程的消息序列化以及比较方法,本实施例5相比实施例1在更加实际场景下来展现本方案的实施流程。
如图5所示,本发明实施例是在只有一个数据源节点、无FLINK_REDUCE_NODE节点、无FLINK_CONNECTOR_NODE节点的情况下的ETL流程分解,由于本流程中无缩减节点与连接节点,因此无FLINK_MESSAGE_SHARED_NOD节点。
source算子执行该source的SourceFunction,读取数据以数据流的形式发送到后续算子。
Transform1接收到对应数据后,Transform1的ProcessFunction执行数据转换,生成新的数据流发送给后续节点;
Transform1生成的数据流发送到后续的sink算子,装载写入相应的目的。
生成算子语句如下:
StreamExecutionEnvironment env=
StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource(SourceFunction).process(ProcessFunction);
数据源独立在SourceFunction中运行,数据源后续所有的节点都在ProcessFunction运行,其中算子API不存在sink。
实施例6:
本发明实施例6提供了一种flink框架运行ETL流程的消息序列化以及比较方法,本实施例6相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图6所示,本发明实施例是在同时存在FLINK_REDUCE_NODE节点、FLINK_MESSAGE_SHARED_NODE节点的情况下的ETL流程分解。
其中,Sort1与Sort2节点为FLINK_REDUCE_NODE节点;Transform1为FLINK_MESSAGE_SHARED_NODE节点。
其中,Transform2为FLINK_MESSAGE_SHARED_NOD节点;Sort1与排Sort2组件为FLINK_REDUCE_NODE节点。
source算子执行该source的SourceFunction,读取数据以数据流的形式发送到后续算子。
Transform1与Transform2各自接收到对应数据后,Transform1与Transform2的ProcessFunction执行各自的数据转换,生成新的数据流发送到后续节点;
Sort1与Sort2各自接收到对应数据后,Sort1与Sort2的SortFunction执行各自的数据转换,生成新的数据流发送到后续节点;
Sort1与Sort2生成的数据流发送到后续的sink1与Sink2的算子,装载写入相应的目的。
实施例7:
本发明实施例7提供了一种flink框架运行ETL流程的消息序列化以及比较方法,本实施例7相比实施例1在更加实际的场景下来展现本方案的实施流程。
如图7所示,本发明实施例是在同时存在FLINK_CONNECTOR_NODE节点、FLINK_MESSAGE_SHARED_NODE节点的情况下的ETL流程分解。
其中Kafka Sink1、Kafka Sink2、Table Sink3为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算子,装载写入相应的目的。
生成算子语句如下:
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来运行;
实施例8:
本发明实施例8提供了一种flink框架运行ETL流程的消息序列化以及比较方法,本实施例8相比实施例1为在Flink算子输出的是数据集具体的情景来展现本方案的实施流程。
如图8所示,其中,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(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,new SelectorFunctionKeys(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发送给下一个算子。
实施例9:
本发明实施例9提供了一种flink框架运行ETL流程的消息序列化以及比较方法,本实施例9相比实施例1为在Flink算子输出的是数据流具体的情景来展现本方案的实施流程。
如图9所示,其中: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(newFlinkKafkaConsumer(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发送给下一个算子。
实施例10:
如图10所示,是本发明实施例的一种flink框架运行ETL流程的消息序列化以及比较装置的架构示意图。本实施例的flink框架运行ETL流程的消息序列化以及比较装置包括一个或多个处理器21以及存储器22。其中,图10中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图10中以通过总线连接为例。
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例1中的flink框架运行ETL流程的消息序列化以及比较方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行flink框架运行ETL流程的消息序列化以及比较方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的一种flink框架运行ETL流程的消息序列化以及比较方法,例如,执行以上描述的图1-图9所示的各个步骤。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种flink框架运行ETL流程的消息序列化以及比较方法,其特征在于,流程方法包括:
ETL流程分解为flink的算子任务提交到flink框架执行,其中一个或者多个ETL节点以及节点之间的连接线构成ETL流程子集,并通过一个Flink算子运行所述ETL流程子集;
定义MessageTypeInfo,MessageTypeInfo派生于Flink内置的TypeInformation,重构实现createSerializer,所述createSerializer返回MessageSerializer,MessageSerializer重构实现serialize与deserialize,所述serialize调用定义的LazyBinarySerializer序列化上游ETL流程子集的输出消息发送给下游ETL流程子集的flink算子,所述deserialize调用定义的LazyBinaryDeSerializer反序列化下游ETL流程子集的flink算子接收到的输入消息;
所述子集的Flink算子调用MessageTypeInfo将所述ETL流程子集的flink算子的输出数据进行序列化并发送给下游子集的flink算子,所述下游ETL流程子集的Flink算子调用所述MessageTypeInfo对接收到的数据进行反序列化,所述被反序列化的数据作为所述下游子集的Flink算子的输入数据,进行数据处理;
实现flink接口来自定义flink框架中消息数据的排序比较的逻辑,重构实现flink的KeySelector接口,重定义所述flink的getKey方法获取消息数据中的待排序字段数据SortMessage,并定义针对SortMessage的SortMessageTypeInfo;重构实现createComparator,所述createComparator定义SortMessageComparator来实现待排序字段SortMessage的比较功能。
2.根据权利要求1所述的flink框架运行ETL流程的消息序列化以及比较方法,其特征在于,所述定义的LazyBinarySerializer,具体包括:
定义DataType对应消息的数据类型;
根据能够利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinarySerializer将所述数据类型中的数据Object[]data序列化为字节数组byte[];
根据无法利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinarySerializer将所述数据类型自定义序列化为字节数组byte[]。
3.根据权利要求2所述的flink框架运行ETL流程的消息序列化以及比较方法,其特征在于,定义DataType对应消息的数据类型包括:String、Boolean、Integer、Byte、Short、Long、Float、Double、Decimal、Date、Time、DateTime、Binary、Clob、Blob、Geometry、Object中的一个或者多个;
其中,所述无法利用Flink自带的TypeInformation进行序列化和反序列化的数据类型具体包括:Binary、CLob、Blob、Geometry中的一个或者多个。
4.根据权利要求2或3任一所述的flink框架运行ETL流程的消息序列化以及比较方法,其特征在于,所述定义的LazyBinaryDeSerializer,具体包括:
根据能够利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinaryDeSerializer将所述数据类型反序列化为数据Object[]data;
根据无法利用Flink自带的TypeInformation进行序列化和反序列化的数据类型,所述LazyBinaryDeSerializer将所述数据类型自定义反序列化,其中,数据类型Binary反序列化为byte[],数据类型CLob反序列化为DMETLClob,数据类型Blob反序列化为DMETLBlob,数据类型Geometry反序列化为Geometry对象。
5.根据权利要求1所述的flink框架运行ETL流程的消息序列化以及比较方法,其特征在于,所述定义SortMessageComparator来实现待排序字段SortMessage的比较功能,具体包括:
定义SortMessage的比较方法类SortUtil,SortUtil定义两个SortMessage的比较方法compare,所述compare方法根据待排序消息的字段类型与排序规则进行字段值的比较,获取比较结果。
6.根据权利要求5所述的flink框架运行ETL流程的消息序列化以及比较方法,其特征在于,所述compare方法根据待排序消息的字段类型与排序规则进行字段值的比较,具体包括:
所述待排序字段类型包括字符串类、数字类、日期时间类中的一个或者多个,所述字段类实现Comparable接口;如果待排序字段为非字符串类型,则使用所述Comparable接口的compareTo进行字段值比较,获取比较结果;
所述排序规则,对于字符串String类型字段,如果排序规则是根据中文拼音排序,则使用com.ibm.icu.text.Collator进行字段值的比较,获取比较结果;如果排序规则是根据字符编码排序,则编码的字节数组进行比较,获取比较结果。
7.根据权利要求1所述的flink框架运行ETL流程的消息序列化以及比较方法,其特征在于,所述一个或者多个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框架中完成。
8.一种flink框架运行ETL流程的消息序列化以及比较装置,其特征在于,flink框架运行ETL流程的消息序列化以及比较装置包括至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行权利要求1-7任一所述的flink框架运行ETL流程的消息序列化以及比较方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111642576.4A CN114385139B (zh) | 2021-12-29 | 2021-12-29 | 一种flink框架运行ETL流程的消息序列化以及比较方法与装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111642576.4A CN114385139B (zh) | 2021-12-29 | 2021-12-29 | 一种flink框架运行ETL流程的消息序列化以及比较方法与装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114385139A CN114385139A (zh) | 2022-04-22 |
CN114385139B true CN114385139B (zh) | 2022-12-16 |
Family
ID=81200588
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111642576.4A Active CN114385139B (zh) | 2021-12-29 | 2021-12-29 | 一种flink框架运行ETL流程的消息序列化以及比较方法与装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114385139B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115563638B (zh) * | 2022-11-15 | 2023-04-18 | 阿里云计算有限公司 | 数据处理方法、系统、设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111209352A (zh) * | 2020-04-20 | 2020-05-29 | 北京聪明核桃教育科技有限公司 | 一种数据处理方法、装置、电子设备及存储介质 |
CN111966943A (zh) * | 2020-08-13 | 2020-11-20 | 上海哔哩哔哩科技有限公司 | 流式数据分发方法和系统 |
CN112287007A (zh) * | 2020-10-30 | 2021-01-29 | 常州微亿智造科技有限公司 | 基于Flink SQL引擎的工业生产数据实时处理方法、系统 |
US11074107B1 (en) * | 2020-11-04 | 2021-07-27 | RazorThink, Inc. | Data processing system and method for managing AI solutions development lifecycle |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113660231A (zh) * | 2021-08-06 | 2021-11-16 | 上海浦东发展银行股份有限公司 | 一种报文解析方法、装置、设备和存储介质 |
-
2021
- 2021-12-29 CN CN202111642576.4A patent/CN114385139B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111209352A (zh) * | 2020-04-20 | 2020-05-29 | 北京聪明核桃教育科技有限公司 | 一种数据处理方法、装置、电子设备及存储介质 |
CN111966943A (zh) * | 2020-08-13 | 2020-11-20 | 上海哔哩哔哩科技有限公司 | 流式数据分发方法和系统 |
CN112287007A (zh) * | 2020-10-30 | 2021-01-29 | 常州微亿智造科技有限公司 | 基于Flink SQL引擎的工业生产数据实时处理方法、系统 |
US11074107B1 (en) * | 2020-11-04 | 2021-07-27 | RazorThink, Inc. | Data processing system and method for managing AI solutions development lifecycle |
Non-Patent Citations (4)
Title |
---|
Flink的数据类型和序列化;写Bug的张小天;《https://www.jianshu.com/p/e8bc484fa4c5》;20170809;1-4 * |
Streaming ETL with Apache Flink and Amazon Kinesis Data Analytics;Steffen Hausmann;《https://aws.amazon.com/cn/blogs/big-data/streaming-etl-with-apache-flink-and-amazon-kinesis-data-analytics/》;20200221;1-14 * |
基于Flink实时计算的自动化流控制算法;樊春美等;《计算机技术与发展》;20200810(第08期);66-72 * |
基于流计算Flink框架的资源调度方法研究;魏碧晴;《中国优秀硕士学位论文全文数据库 信息科技辑》;20210115;I138-804 * |
Also Published As
Publication number | Publication date |
---|---|
CN114385139A (zh) | 2022-04-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11526531B2 (en) | Dynamic field data translation to support high performance stream data processing | |
US20110283183A1 (en) | Method for compressing/decompressing structured documents | |
CN109902274B (zh) | 一种将json字符串转化为thrift二进制流的方法及系统 | |
CN101841515B (zh) | 可变目标的协议数据单元编解码代码自动生成的实现方法 | |
US8120515B2 (en) | Knowledge based encoding of data with multiplexing to facilitate compression | |
CN111884660B (zh) | 一种哈夫曼编码设备 | |
CN114385139B (zh) | 一种flink框架运行ETL流程的消息序列化以及比较方法与装置 | |
CN113778449B (zh) | 航空电子接口数据适配转换系统 | |
US20230403026A1 (en) | Sorting network-based dynamic huffman encoding method, apparatus and device | |
US7404186B2 (en) | Signature serialization | |
US5974411A (en) | N-way processing of bit strings in a dataflow architecture | |
Chu et al. | VLSI architectures for high speed recognition of context-free languages and finite-state languages | |
CN114385136B (zh) | 一种Flink框架运行ETL的流程分解方法和装置 | |
CN116628066A (zh) | 数据传输方法、装置、计算机设备和存储介质 | |
CN115630614B (zh) | 数据传输方法、装置、电子设备与介质 | |
CN116755770A (zh) | 一种基于组合模式的icd头文件生成方法 | |
CN107623524B (zh) | 一种基于硬件的Huffman编码方法及系统 | |
CN115167869A (zh) | 一种Java对象序列化和反序列化的方法、电子设备及介质 | |
Ching et al. | RcppMsgPack: MessagePack Headers and Interface Functions for R. | |
CN111913691A (zh) | 一种Python和Java数据互操作的方法和装置 | |
CN114385137B (zh) | 一种Flink框架运行ETL的流程方法和装置 | |
CN114385138B (zh) | 一种Flink框架运行ETL的流程联合组件方法和装置 | |
CN104572763A (zh) | 一种分布式计算系统中对象传递的方法 | |
US7447787B2 (en) | Protocol executing system and protocol PDU common data structure converting method for processing protocol PDUS | |
CN114095036B (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 |