00:01
那么介绍另外一个模式叫end的模式啊,另外要注意啊,它是0.10开始才支持的,那么对于我们如果是insert的这种模式方式下,呃,Mo默认会有一个小文件策略,对不对?呃,我们前面也演示了一个什么就是文件大小的控制,对吧?它而且我们也看到log文件是不是会不断的去做一个追加呀,对吧?那这种本身就天生就可以避免一个小文件的问题,那么如果是Co表,它问题就来了,我们每次是不是都是生成,每次写入都是生成新的扒回的,这也就没有所谓的小文件不小文件的了,那这个时候忽底提供了丰富的什么classing数据巨触策略,简单来理解什么叫ing合并小文件。啊,没错,就是合并小文件就将数据集中起来嘛,啊,那优化我们在insert模式下的小文件问题啊。
01:07
那我这个银色的指的是咱们是不是有阿色银色的报银色那几个啊。好了,那么大家注意啊,呃,有一个叫in nine classing,就很简单,就是指定这个参数right inser class啊,默认是false,它的意思是写入时要不要合并小文件,以前cow表只负责生成新的pack,我管你有没有小文件啊,他才不管呢,那么默认呢,它是不合并的,开启参数之后会优先合并之前的小文件,但是不去重。吞吐也会受影响,所以这个东西可能用的比较少啊,那用的比较多的建议使用的是这个功能,而且也是0.12的新特性啊,0.12开始有的,首先这个东西跟我们那个compassion有点像,呃,大家对比着学,对比着看,为什么要有点像呢?首先看这个,呃,看这个跟这个,这个是什么,是不是异步的开关,对,0.12开始它支持异步啊,异步就是哎,我通知你要去做这个事儿,那至于做多久,什么时候完成,那是你的事儿啊,有个开关,那除了它呢,它也是分为两个阶段,第一阶段呢,就是先要执行调度,也就是生成它所谓的plane,就类我们前面建了很多compassion,那个先plan再compassion是不是啊,一样的道理啊,它这边的设计是一样的,那还有一个就是它的触发机制啊,什么时候会触发,那就有很多很多参数来控制了。
02:45
来,首先有一个德尔塔Miss,这是调度这个计划的间隔,就是比如说我可以间隔四次来触发一次classing。然后就会生成先生成计划啊,先生成计划再进行合并小文件啊,这个跟compasion是不是有点像,跟compaion那种基于commit次数的策略一样,对吧?啊,这个参数是这个意思,再往下呢,就是它的并发啊,默认也是次,再往下呢,这个就是什么呃的生成计划的策略。
03:19
之后呢?目标文件的最大大小,也就是说你不是合并小文件吗?那你合并完之后的这个文件最大能有多大,或者说你想要把这些小文件合并成一个多大的文件,那这个呢,默认值是一个G啊,默认是一个G啊,就是我目我的目标就是将小文件合并成一个G的文件啊,这样子当然是最大,不一定说一定要达到一个G,如果我合起来总共只有500兆,那就500兆呗啊,所以这个叫max,呃,另外一个是小文件限制,呃,默认是600,那么你看小于该大小的文件才会这就小于这个,我认为你是小文件,你要被我合并了啊,我就要弄你了啊,就这个意思。
04:05
这就这个什么,Fire limit。那这个600,呃,我还是写一下吧,默认600兆,这个是兆啊,兆不是字节,也不是K啊,不要搞错了啊。好,那接下来就是指可以指定一个排序字段,还有呢,可以做一个什么分区的过滤模式啊,支持两种,一个是不做限制,第二个是按照时间来。啊,第按照时间去做一个回溯啊。Days是按天来的啊。回溯就往前嘛,第二个还有一个就是按我我对指定的分区进行处理啊。好,那还有最后一个,呃。这个是用在按天进行处理的时候啊,那它这个东西就是默认是两天look back,也就是说你你按天回溯,那你到底要找多少天之前的,你不会说我三年前的你也找吧啊对吧,也就是说这个是限制我往前找回溯多少天啊的分区,我要来做处理啊,要来要来做合并小文件啊,这是默认是二啊两天啊。
05:21
好,这个是整体的一些参数啊,对于我们来讲很多保持默认就行了,我们要做的是只有两件事儿啊,主要就是两件事儿,一个把它改成处,第二调度改成处。第三并发可以调一调啊,第四就是一些大小限制,小文件呢,什么叫小文件小于多少啊对吧,那合并完之后多大呀,这些参数而已啊,那其他就没什么了,那这个呢。依赖于这个功能啊,我们来解决一些小文件的问题啊。嗯。
06:01
那下面咱们是具体又讲了讲一些策略啊,就像刚才讲的Fi mode不是有三种吗?啊,一个是不做限制,一个是回溯几天,一个是指定分区,那这个参数刚才也讲了默认,如果是按天回溯的话,是默认往回溯两天啊,那其他的呢,是在指定分区生效的啊,就是。指定一个分区范围,它的范围是什么?Begin end,这是这种策略啊,也就这个指定分区的时候,再往下呢,就是我们可以指定分区的话,我们可以按照一个正则表达式去匹配,因为你不一定是很方便可以指定开始跟结束啊。再有一个呢。就直接就是你要哪个分区,我直接写死给你啊,然后用逗号分格没了啊,那这个就是一个class啊,咱们就介绍一下。那顺便我们提1.1个特别好用的功能,Bucket索引,这个是0.11版本才开始有的一个功能,而且能有效的非常有效的提升我们这个索引的一个效率啊,这个也是在以前版本当中有,有一些就大厂啊,应该是自节吧,他们是自己开发了一个bucket index,后来呢,就回馈了,回馈了我们的护体社区,那这个功能也正式合并到我们的开源版本了啊,那一版本就开始有了,可以说是非常用的啊,那默认我们流式写入,咱们知道索引类型Spark有什么布隆啊,简单索引啊,H base索引对吧,那flink我们说它是不是默认维护在状态里面。
07:41
对吧,那问题就来了,当我的数据量极大,我的索引就会变得很大,那索引一大,那就是flink大状态的问题啊,那效率啊,资源啊,性能啊都是问题。啊,如果你达不到那个量,你可能感受不到啊,这也是人家大厂的一个痛点啊,后来就有有了这个功能啊,那么我们知道索引是组件到fire ID的一个映射,对吧?前面讲过数据量大的时候会成为瓶颈啊,那八的索引是什么?通过一种固定的哈希策略,将相同T的数据分配到同一个fire group,也就是说他这一边做了一个区分啊,你不是多嘛,就像古代,呃,我们说韩信点兵越多多益善嘛,比如说1万个人让你,让你带领,你能不能管理好这1万个人啊,能不能指挥好这1万个人,对吧,那有的人就有办法有招啊,他有招啊,啊对吧,他就分组呗,啊我下设三个三个分队对吧?每个分队3000人,那每个分队再下来一个小队长,每个小队长在管多少人啊,就是按照类似的这种组织管理的方式啊,你那你现在按照固定的哈希策略,有了相同的key,那管理起来就快了啊。
08:55
将相同key分配到一个fair group。数据啊,这个key是,呃,将相同primary key的数据分配到同一个fire group啊,以前是没有这个规范的,对不对,以前就是,哎我这个,呃,我可能有多个fire group,哎我ID为一的在这,哎我二在这,我三在这,我可能这里还有一点其他的对不对。
09:24
那这样的话,呃,就可以避免了索引的。存储和查询开箱。那么要用的话也简单,就是在with里面指定这个参数建表,建互利表的时候啊,Index type默认值是一个flink state,我们只要把这个改成一个什么bucket就可以了啊,这个你要上链才能体现到那个性能的区别,然后呢,我们要根据哪一个字段做一个哈希,默认值是按照组键啊,那我们可以设置成组键的子集,这什么理解呢?我有没有可能组键有多个字段,我是不是可以有两个两个字段拼接起来的组件,那我可以筛选其中一个,比如说按age我来做一个哈希就好了,ID我就不要了啊。那接下来就是你分的八体的数量,默认值是分成四个,因为它是什么呢?先取了一个哈希值,对于这个key,你指定的这个key啊,其实这个key指的应该是这个字段啊,然后取了一个哈希,不是primary key啊。
10:28
也有,也可能是子集啊,那我按它取了个哈希,我是不是要磨上哎,我的八的数量,那比如说我要分成四个8ET的,那这样的话,呃,我我磨上的结果不就是0123嘛,对不对。好,设置后不可再变更啊,这个要注意,那么我们对比一下老索引啊,它的优点是什么?呃,Bucket index没有传统的这种flink data的存储计算开销性能较好啊,大家就记住四个字,性能较好啊。
11:04
第二一个呢。呃,这种bucket方式没法去增加bucket啊,无法扩buckets对吧,但是state index可以根据文件的大小动态扩容啊,因为你八的这个数量一指定那就写死了啊。我们在这里说了不可再变更啊,另外呢,八应该是不能够跨分区的变更啊,我们只支持同一个分区的啊,那如果是CDC的这种方式,没有这个限制啊,目前的设计是这样。啊,那state他也没有限制,STATE1一开始就没有限制好了。
我来说两句