首页 > 其他分享 >开源交流丨批流一体数据集成框架ChunJun数据传输模块详解分享

开源交流丨批流一体数据集成框架ChunJun数据传输模块详解分享

时间:2022-08-24 10:58:55浏览次数:111  
标签:批流 开源 ChunJun 算子 类型 数据传输 序列化 数据

课件获取:关注公众号“ChunJun”,后台私信 “课件” 获得直播课件

视频回放:点击这里

ChengYing开源项目地址:githubgitee 喜欢我们的项目给我们点个__ STAR!STAR!!STAR!!!(重要的事情说三遍)__

技术交流钉钉 qun:30537511

本期我们带大家回顾一下六六同学的直播分享《ChunJun数据传输模块介绍》。

一、ChunJun数据类型转换

1、类型转换解决的问题

大家一听到「ChunJun数据类型转换」这个概念,可能会联想到上下游之间进行数据交互时会涉及到的隐式转换。如果上游和下游数据类型一致,则不需要对数据进行任何干预,直接进行下发即可。

但是大多数情况下会涉及到两个问题,一是上游的数据源类型和下游的数据源类型不一致。比如MySql的varchar类型要写到HdfsOrc文件里的string类型的话,在上游的表示是varchar,在下游的表示是string,但实际上中间段java的类型都是string。

另外一种情况则是,上下游之间不止数据源类型不一样,数据类型也不一样,除了要做类型的映射之外,还需要对数据本身进行改动。比如,MySql的date类型要写到下游timestamp类型,我们需要进行的操作是把date中的毫秒级的时间戳拿出来,转换成timestamp的类型,再往下游去写。

这样就引出了一个问题,如何建立所有数据源类型之间的映射/转换关系?下面将为大家解答这个问题。

file

2、类型映射概览

• client端:在Factory类中通过RawConverter类建立映射关系

• source端:将数据封装成AbstractBaseColumn

• sink端:通过AbstractBaseColumn中的转换方法将数据转换成对应类型

file

ChunJun目前支持的数据类型映射关系图如下:

file

3、类型映射详解

以Timestamp为例,如果要写入到Long类型的话,根据上文展示的ChunJun数据类型映射关系图,最终映射到TimestampColumn中,具体流程如下图:

file

上面这个例子描述的是一个单独的字段,正常情况下,会处理多个字段,这时的类型映射详解情况如下图:

file
as方法就是数据类型转换的方法。使用这个机制之后,在下游可以只关心需要的数据类型,增加开发效率。

二、ChunJun数据传输过程

了解完ChunJun数据类型转换后,我们来为大家分享ChunJun的数据传输过程。

1、上下游数据传输方式

在ChunJun中进行同步作业,有两种情况,一是算子链打开的情况,上游的Source和下游的Sink会被合并成一个task,有同一个线程去做调度;二是把算子链进行关闭,Source和Sink各自形成一个task,也有各自的线程去进行调度。

在算子链打开的情况下,上下游数据传输方式可分为两种,对象重用和拷贝。

● 对象重用

· 上下游数据传输使用方法调用的形式,将上游产生的数据的对象引用直接交给下游

· 上下游算子需要形成算子链,作业开启对象重用

· env.getConfig().enableObjectReuse();

● 拷贝

· 上游传输给下游的数据,需要经过一次深拷贝

· 上下游算子需要形成算子链

算子链的好处是可以减少序列化的操作,那么为什么我们还要引入序列化呢?因为ChunJun的特殊性。ChunJun同步作业的话,只有上下游两个算子,且都对接了正式的数据源,读写的时候会导致线程堵塞。因此上限由网络io决定,如果断开算子链,cpu会在一端线程阻塞的时候切换到另外一端。在序列化的性能较高时,线程上下文切换带来的性能下降完全可以被弥补。

经过测试,序列化的性能比对象重用和拷贝高30%左右。

● 序列化

· 上下游数据传输依赖于网络传输。上游数据进行序列化成byte数组后进行网络传输,下游收到数据后需要进行反序列化

· 上下游之间不形成算子链

file

知道要做序列化后,会产生一些思考,带着这些疑问,接着往下看。

• 序列化和反序列化在什么时候发生?

• Flink支持哪些序列化?

• 序列化是怎么做的?

• 怎么找到适合的序列化方式?

• 如何实现自定义的序列化?

2、序列化传输过程

下图是ChunJun在进行序列化操作时的数据传输链路图:

file

3、DataOutView

file

4、TypeInformation介绍

file

5、kryo序列化&BaseSerializer

同样是序列化一个int对象,对kryo来说,首先需要知道它的类型,然后从高位到低位依次去写入。

DataOutputView则是直接调用一个writeInt的方法,写一句关键代码即可:

UNSAFE.putInt(

this.buffer,

BASE_OFFSET + this.position, v);

file

三、ChunJun序列化实现

1、ColumnRowData序列化过程

ColumnRowData序列化过程采取标志位+实际数据的方式,具体流程如下图:

file

相对于kryo的序列化来说:

· 实现了更密集的存储

· 兼容null值

· 减少了不必要的数据传输

2、BinaryRowData结构

file
因为数据区一格只占8个字节,且每个index只能占到一位,所以肯定存在一些没法存储在8字节范围之内的数据,可变长度部分就是用来存放数据区无法存放的数据。

3、BinaryRowData-setNull操作

看到上文的null值判断区,有些同学可能会好奇这是什么,又是怎么进行操作的。下图将对一个下标为11的数据去做setnull操作,进行简单介绍:

file

4、BinaryRowData数据存储方式

file

标签:批流,开源,ChunJun,算子,类型,数据传输,序列化,数据
From: https://www.cnblogs.com/DTinsight/p/16619048.html

相关文章

  • 开源的跨平台音乐标记器
     MusicBrainzPicard是一款免费的开源软件,这款软件拥有精简的用户界面,能够执行各类音频标记操作。Picard是一种高效的工具,值得从头开始设计音频标记器和音轨标识符,以帮助......
  • 参与开源共建,你不可不知的贡献技巧
    近期,在“战码先锋,PR征集令”活动中,上百位开发者们热情踊跃地参与了活动,以提PR的方式为OpenHarmony项目贡献自己的力量。但对于开源新手来说,刚开始接触开源项目,对项目结构......
  • 周一见!距离阿里巴巴开源开放周还有3天
    面对快速变化的世界开源领域涌现了哪些新技术和发展模式?开源社区建设又有哪些新进展和创新实践?下周8月22日-24日连续三天,精彩不止锁定"阿里技术"视频号直播和开发者......
  • 关于开源软件协议的选择
    早期:GPLGPLv2GPLv3中期:ApacheMPLAGPLLGPL最近BSLSSPLElastic以及特殊的附加条款CommonClauseOSICertified:OSI认证,开源标准的守护者,社区约束并非法......
  • 开源阅读
    开源阅读阅读是一款可以自定义网络来源内容的阅读工具。主要功能自定义书源,自己设置规则,抓取网页数据,规则简单易懂,软件内有规则说明。列表书架,网格书架自由切换。......
  • 我开源了一个Go学习仓库|笔记预览
    前言大半个月前我参与了字节后端面试,未通过第四面,面试总结写在了这篇文章:https://juejin.cn/post/7132712873351970823在此文的末尾,我写到为了全面回顾Go的知识点,我开始......
  • 蚂蚁金服开源的这份SpringBoot笔记,曾在24小时内GitHub星标48k
    前言Spring的影响力想必就不用小编多说了,今天要跟大家说的是SpringBoot。SpringBoot作为目前Spring技术体系中炙手可热的框架之一,已经是开发者们的必备神器了。在实际......
  • openlitespeed LiteSpeed 的开源版
    LiteSpeed国内可能使用的人不是很多,大家使用nginx比较多,据说LiteSpeed性能是nginx的好多倍openlitespeed的特性事件驱动兼容apache的mod_rewirte管理员友好安......
  • github_findpath_v1.0-Github开源项目目录爆破程序
    Github开源项目目录爆破程序​ 写了个小工具,欢迎师傅们提建议​ 某一天回我的母校溜达了一圈,然后用GoogleHack找到了一个后台,用Wappalyzer没识别到CMS,但是看着这东西......
  • Bika LIMS 开源LIMS集—— SENAITE的使用(仪器管理的使用)
    设备类型对设备进行分类。设备设备台账。设备管理中可设置Validation、Calibration、QCSample等质控信息以及仪器数据采集信息。......