开源交流丨批流一体数据集成框架ChunJun数据传输模块详解分享
课件获取:关注公众号“ChunJun”,后台私信 “课件” 获得直播课件
视频回放:点击这里
ChunJun开源项目地址:github 丨 gitee 喜欢我们的项目给我们点个__ STAR!STAR!!STAR!!!(重要的事情说三遍)__
技术交流钉钉 qun:30537511
本期我们带大家回顾一下六六同学的直播分享《ChunJun数据传输模块介绍》。
一、ChunJun数据类型转换
1、类型转换解决的问题
大家一听到「ChunJun数据类型转换」这个概念,可能会联想到上下游之间进行数据交互时会涉及到的隐式转换。如果上游和下游数据类型一致,则不需要对数据进行任何干预,直接进行下发即可。
但是大多数情况下会涉及到两个问题,一是上游的数据源类型和下游的数据源类型不一致。比如MySql的varchar类型要写到HdfsOrc文件里的string类型的话,在上游的表示是varchar,在下游的表示是string,但实际上中间段java的类型都是string。
另外一种情况则是,上下游之间不止数据源类型不一样,数据类型也不一样,除了要做类型的映射之外,还需要对数据本身进行改动。比如,MySql的date类型要写到下游timestamp类型,我们需要进行的操作是把date中的毫秒级的时间戳拿出来,转换成timestamp的类型,再往下游去写。
这样就引出了一个问题,如何建立所有数据源类型之间的映射/转换关系?下面将为大家解答这个问题。
2、类型映射概览
• client端:在Factory类中通过RawConverter类建立映射关系
• source端:将数据封装成AbstractBaseColumn
• sink端:通过AbstractBaseColumn中的转换方法将数据转换成对应类型
ChunJun目前支持的数据类型映射关系图如下:
3、类型映射详解
以Timestamp为例,如果要写入到Long类型的话,根据上文展示的ChunJun数据类型映射关系图,最终映射到TimestampColumn中,具体流程如下图:
上面这个例子描述的是一个单独的字段,正常情况下,会处理多个字段,这时的类型映射详解情况如下图:
as方法就是数据类型转换的方法。使用这个机制之后,在下游可以只关心需要的数据类型,增加开发效率。
二、ChunJun数据传输过程
了解完ChunJun数据类型转换后,我们来为大家分享ChunJun的数据传输过程。
1、上下游数据传输方式
在ChunJun中进行同步作业,有两种情况,一是算子链打开的情况,上游的Source和下游的Sink会被合并成一个task,有同一个线程去做调度;二是把算子链进行关闭,Source和Sink各自形成一个task,也有各自的线程去进行调度。
在算子链打开的情况下,上下游数据传输方式可分为两种,对象重用和拷贝。
● 对象重用
· 上下游数据传输使用方法调用的形式,将上游产生的数据的对象引用直接交给下游
· 上下游算子需要形成算子链,作业开启对象重用
· env.getConfig().enableObjectReuse();
● 拷贝
· 上游传输给下游的数据,需要经过一次深拷贝
· 上下游算子需要形成算子链
算子链的好处是可以减少序列化的操作,那么为什么我们还要引入序列化呢?因为ChunJun的特殊性。ChunJun同步作业的话,只有上下游两个算子,且都对接了正式的数据源,读写的时候会导致线程堵塞。因此上限由网络io决定,如果断开算子链,cpu会在一端线程阻塞的时候切换到另外一端。在序列化的性能较高时,线程上下文切换带来的性能下降完全可以被弥补。
经过测试,序列化的性能比对象重用和拷贝高30%左右。
● 序列化
· 上下游数据传输依赖于网络传输。上游数据进行序列化成byte数组后进行网络传输,下游收到数据后需要进行反序列化
· 上下游之间不形成算子链
知道要做序列化后,会产生一些思考,带着这些疑问,接着往下看。
• 序列化和反序列化在什么时候发生?
• Flink支持哪些序列化?
• 序列化是怎么做的?
• 怎么找到适合的序列化方式?
• 如何实现自定义的序列化?
2、序列化传输过程
下图是ChunJun在进行序列化操作时的数据传输链路图:
3、DataOutView
4、TypeInformation介绍
5、kryo序列化&BaseSerializer
同样是序列化一个int对象,对kryo来说,首先需要知道它的类型,然后从高位到低位依次去写入。
DataOutputView则是直接调用一个writeInt的方法,写一句关键代码即可:
UNSAFE.putInt(
this.buffer,
BASE_OFFSET + this.position, v);
三、ChunJun序列化实现
1、ColumnRowData序列化过程
ColumnRowData序列化过程采取标志位+实际数据的方式,具体流程如下图:
相对于kryo的序列化来说:
· 实现了更密集的存储
· 兼容null值
· 减少了不必要的数据传输
2、BinaryRowData结构
因为数据区一格只占8个字节,且每个index只能占到一位,所以肯定存在一些没法存储在8字节范围之内的数据,可变长度部分就是用来存放数据区无法存放的数据。
3、BinaryRowData-setNull操作
看到上文的null值判断区,有些同学可能会好奇这是什么,又是怎么进行操作的。下图将对一个下标为11的数据去做setnull操作,进行简单介绍:
4、BinaryRowData数据存储方式
袋鼠云开源框架钉钉技术交流群(30537511),欢迎对大数据开源项目有兴趣的同学加入交流最新技术信息,开源项目库地址:https://github.com/DTStack

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
英伟达首席科学家:深度学习硬件的过去、现在和未来
作者|BillDally 翻译|胡燕君、沈佳丽、贾川 过去十年是深度学习的“黄金十年”,它彻底改变了人类的工作和娱乐方式,并且广泛应用到医疗、教育、产品设计等各行各业,而这一切离不开计算硬件的进步,特别是GPU的革新。 深度学习技术的成功实现取决于三大要素:第一是算法。20世纪80年代甚至更早就提出了大多数深度学习算法如深度神经网络、卷积神经网络、反向传播算法和随机梯度下降等。 第二是数据集。训练神经网络的数据集必须足够大,才能使神经网络的性能优于其他技术。直至21世纪初,诸如Pascal和ImageNet等大数据集才得以现世。 第三是硬件。只有硬件发展成熟,才能将大型数据集训练大型神经网络的所需时间控制在合理的范围内。业内普遍认为:比较“合理”的训练时间大概是两周。至此,深度学习领域燃起了燎原之火。 如果把算法和数据集看作是深度学习的混合燃料,那么GPU就是点燃它们的火花,当强大的GPU可用来训练网络时,深度学习技术才变得实用。 此后,深度学习取代了其他算法,被广泛应用在图像分类、图像检测、语音识别、自然语言处理、时序分析等领域,甚至在围棋和国际象棋方面也能看到它的身影。...
- 下一篇
从实验室到用户桌面,深度解析AI 落地实践之路
作者:Bowen Zhang,张博,云智慧 CTO。 随着 AI 的快速发展,各行业里面涌现出了许多质疑的声音,如“AI 仅是实验室的产品”,“AI无法真正落地”等。众所周知,一个算法从实验室到用户桌面会经历非常多的复杂过程,而这不仅仅靠的是纸上谈兵。因此,本篇文章中,Bowen Zhang 通过云智慧在 AI 领域的实践经历,详细讲解 AI 从实验室到用户桌面落地的整体思路与流程。 AIToB 行业综述 下图为人工智能投资数量统计图,由此可得,人工智能在 2017 年至 2018 年之间极其之火热,投资数量从 619 笔迅速涨到了 651 笔,而到 2019 年后,人工智能投资数量大幅度减少。 此外,根据下方行业论述,随着行业发展,AI 投资逐渐去泡沫化。因此,从投资者的角度来讲,我们可以得出这是“ AIToB 最坏的时代”。 “有三个 AI 专家就能估值7亿、靠 AI 概念忽悠投资人的时代已经过去了。” “AI 公司最终还是要用商业逻辑来关注公司发展。AI 本质上是一个 TO B 赋能的工具,AI 公司往往是把AI在一个商业场景中的应用做实做深。” ——李开复 Rebuild 20...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16