博客 大数据集成平台哪家好用

大数据集成平台哪家好用

   沸羊羊   发表于 2023-09-27 10:09  426  0

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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/fc2332be2e585c8cd782d069c2b854a8..jpg

ChunJun数据类型转换


01

类型转换解决的问题

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


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


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


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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/73fcf7c33f193ceb03d339b7fe7bc948..jpg


02

类型映射概览

  //  

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

• source端:将数据封装成AbstractBaseColumn

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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/849ea749c20f8f4fe79080b95943224b..jpg


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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/725b7633d2abc95916602401bbc43c6e..jpg


03

类型映射详解

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/99deebc83dac2769d85544ec84034b1e..jpg


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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/5ff35a733182a98347edeca2c25dad4d..jpg

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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/165d21eb7faa43670e56a28003c6ce6f..jpg

ChunJun数据传输过程


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

01

上下游数据传输方式

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


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

● 对象重用

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

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

· env.getConfig().enableObjectReuse();


● 拷贝

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

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


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


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

● 序列化

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

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/2aaca56c18bdfe0c1c647779af5dafa7..jpg


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

  //  

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

• Flink支持哪些序列化?

• 序列化是怎么做的?

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

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


02

序列化传输过程

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/f108405d62671731157f1977edac9887..jpg


03

DataOutView

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/f9661443714fc89f7007c6552ef4f861..jpg


04

TypeInformation介绍

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/50c2fc4f52a31a92e942c0f92448ef4e..jpg


05

kryo序列化&BaseSerializer

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


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

UNSAFE.putInt(

this.buffer, 

BASE_OFFSET + this.position, v);

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/c94af61b89baf6acaabec2f5a648d21f..jpg


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/21917293f2c0353fd5c8ec13a4dda19c..jpg

ChunJun序列化实现


01

ColumnRowData序列化过程

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/036f92580bb72ae1b2850d0c6ca619ba..jpg


相对于kryo的序列化来说:

· 实现了更密集的存储

· 兼容null值

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


02

BinaryRowData结构

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/477975cf09fce3a492306f69df8c6e98..jpg

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


03

BinaryRowData-setNull操作

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/4c0888a5f977ea90aca01179511a0a30..jpg


04

BinaryRowData数据存储方式

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user166259/article/cf56a85e42d36a796ec55f204dfe3629..jpg



《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack


0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群