| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 批流一体数据集成框架ChunJun数据传输模块详解分享 -> 正文阅读 |
|
[大数据]批流一体数据集成框架ChunJun数据传输模块详解分享 |
课件获取:关注公众号“ChunJun”,后台私信 “课件” 获得直播课件 视频回放:点击这里 本期我们带大家回顾一下六六同学的直播分享《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中,具体流程如下图: 上面这个例子描述的是一个单独的字段,正常情况下,会处理多个字段,这时的类型映射详解情况如下图:
二、ChunJun数据传输过程了解完ChunJun数据类型转换后,我们来为大家分享ChunJun的数据传输过程。 1、上下游数据传输方式在ChunJun中进行同步作业,有两种情况,一是算子链打开的情况,上游的Source和下游的Sink会被合并成一个task,有同一个线程去做调度;二是把算子链进行关闭,Source和Sink各自形成一个task,也有各自的线程去进行调度。 在算子链打开的情况下,上下游数据传输方式可分为两种,对象重用和拷贝。 ● 对象重用 · 上下游数据传输使用方法调用的形式,将上游产生的数据的对象引用直接交给下游 · 上下游算子需要形成算子链,作业开启对象重用 · env.getConfig().enableObjectReuse(); ● 拷贝 · 上游传输给下游的数据,需要经过一次深拷贝 · 上下游算子需要形成算子链 算子链的好处是可以减少序列化的操作,那么为什么我们还要引入序列化呢?因为ChunJun的特殊性。ChunJun同步作业的话,只有上下游两个算子,且都对接了正式的数据源,读写的时候会导致线程堵塞。因此上限由网络io决定,如果断开算子链,cpu会在一端线程阻塞的时候切换到另外一端。在序列化的性能较高时,线程上下文切换带来的性能下降完全可以被弥补。 经过测试,序列化的性能比对象重用和拷贝高30%左右。 ● 序列化 · 上下游数据传输依赖于网络传输。上游数据进行序列化成byte数组后进行网络传输,下游收到数据后需要进行反序列化 · 上下游之间不形成算子链 知道要做序列化后,会产生一些思考,带着这些疑问,接着往下看。 ? 序列化和反序列化在什么时候发生? ? Flink支持哪些序列化? ? 序列化是怎么做的? ? 怎么找到适合的序列化方式? ? 如何实现自定义的序列化? 2、序列化传输过程下图是ChunJun在进行序列化操作时的数据传输链路图: 3、DataOutView4、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结构
3、BinaryRowData-setNull操作看到上文的null值判断区,有些同学可能会好奇这是什么,又是怎么进行操作的。下图将对一个下标为11的数据去做setnull操作,进行简单介绍: 4、BinaryRowData数据存储方式ChunJun开源项目地址:github?丨?gitee?喜欢我们的项目给我们点个__ STAR!STAR!!STAR!!!(重要的事情说三遍)__ 技术交流钉钉 qun:30537511 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 5:48:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |