00:01
那我们再聊一个湖底当中的一个核心操作,也就数据写入的一些操作啊,还有一些基本的原理,这个大家就视情况来了解,如果你仅仅是应用呢,你这一块就简单搂一眼就可以,如果你想啊多了解深一点,那你就好好去了解这一块,研究这一块啊,那么基本要知道的是忽迪的写入操作啊,大概可以分为三大类啊,第一类是所谓的upset,也就是说插入或者更新,那这个时候它是严格依赖于什么呢?索引啊,索引咱们前面也聊很多,它是必须依赖于索引的,就是说upset必须依赖于索引啊,这也是忽底的一个。特点特性高效的UPS啊,还有结合索引,另外呢,它会去标记你是插入还是更新的数据,另外呢,根据不同表不同场景啊,也就是说它有一定的策略啊,去写做一些写入的行为啊,这是upset一会我们具体看啊,另外一种就是insert,就是只追加的方式,其实啊,但就是跳过索引啊,就是你这个索引我不管了,反正我有新的数据来,我管你是什么样的,我都直接就是追加追加追加追加啊,但是这个的嗯,回头你要自己去做一个去虫的一个处理啊。
01:18
还有一种是b insert是那个批量插入,批量插入这种是后面新版本提供的一种,呃,优化功能啊,这样的性能会更好,它会做一个排序,然后进行一个写入啊,它是对大数据量的互利表,呃,初始化的话用这种方式会更好一点啊。而且对文件大小的限制是最好的,一最好的一个一个效果,行,那就是粗略的知道有up,四有insert,有b insert对吧?啊那最重要的默认的就是这个upsett是我们一定要了解的,好那我们具体来看呢,Upset咱们就按照两种表来解读,第一种是Co表,它怎么做的,第二一个呢,就是Mo怎么做的,其实前面多多少少聊过,我们再捋一遍啊对于cow表我们进行一个afterset,它是先什么呢?按先对我们的这一批数据按照指定的key去重,举个例子啊,1A2B3C啊三比如说是这批数,这是一批数据对吧?啊那如果我们指定的第一列为我们的T,我们的键,那就就这个ID值就是建了,对吧?那比如说你数据还有一条EA是不是有重复啊啊,它会先按照指定这个key,还先给你去个重啊,然后呢,对这一批数据创建索引,所以我们。
02:42
讲的就是record key啊对吧,加上分区路径啊,然后呢,跟我们的文件ID,文件组的ID,呃,形成一个映射关系啊,也就是说会记录诶这一条数据,呃,对应的是哪一个fair ID啊那行这个索引细节不聊了,呃另外这个索引还有一个作用是区分我们是更新还是银色的。
03:08
Insert就表示这个这个key是第一次写入啊,如果不是第一次写入,那就是需要更新嘛,这个好理解吧,也就是通过索引创建索引,并且区分更新还是插入好,那接下来既然要区分,那就有不同的处理方案呢,一个是对于update,一个对于银色的,如果是更新呢,它会找到这个key。啊,咱们这个蝴d key对应的这个啊文件片,咱们所以不是维护了这个key跟文件片的关系嘛,对吧?啊,他能找到,他找到这个文件片之后啊,啊不是文件组ID啊,那文件组ID再找到最新的文件片,然后再找到里面的base文件,Base文件什么意思呢?啊,我给你说啊PA就是它的,呃,就是如果你看到说什么基本文件呢,列文件呢啊PA啊指的都是这么一回事儿,就是指的这种PA回文件好吧,并且呢,做一个什么默具。
04:06
默举完之后写入到新的什么base,也就新的文件片就生成新的PA嘛,就是咱们前面一直讲的有新的一批数据来,我把老的pack全拷贝过来,将新的数据跟老的数据合并,合并而写入到新的pack,就这个意思能理解吧,这个就是更新,那如果是纯粹的插入呢,我不是更新呢啊,它就有点不一样了啊,它会先扫描当前分区下面的小文件。也就是说有一个阈值啊,这个参数可以控制,比如说是十兆,哎,我说小于十兆的这个pack文件,呃,如果有,那我这个插入的消息我就往里面去写,往里面追加啊,如果没有这种小的PA回的文件,我怎么办呢?啊,没有小的让你蹭啊,你蹭不了啊,那怎么办?那你就自己来呗,你写一个新的不就完事了吗?啊,就写入一个新的文件组,文件组里面的一个新的文件片能理解吧,也就是说有地方蹭那就蹭啊,没地方蹭就自己去开一间,对吧?啊,这个简单啊,这是Co那就麻烦了啊,也不是麻烦啊,就是跟索引有很大关系啊,Mo的话来,如果是Mo的upset写入啊。
05:22
那也好理解啊,那你呃,首先还是一样,根据咱们指定的数记录键或者叫数据键进行一个去重,就刚才例子啊,有1A2B3C啊啊然后再来一条1A,你指定第一个字段ID为为这个键的话啊,那就先按照这个键去虫,诶诶发现有两个一,诶去个虫我只保留一个啊好然后呢,同样是什么创建索引,然后这个索引也会区分是update还是insert,这个这两部跟Co是一样的啊,是一样的,好接下来就不一样的啊,它对insert跟update分别是怎么处理呢?我们来看啊,对于insert如果。
06:05
因为正常咱们增量提交Mo Mr是是不是要写点log文件,前面我也简单提了,得区分能不能见索引是不是,如果是不可见索引,也就是你用的是布隆啊,说白了就是布隆嘛,这也是默认的,对不对?如果你用Spark引擎,好吧,它会尝试什么?它会干什么呢?梦GE分区内最小的basefi,所谓的basefi就是。呃不呃,那个pack的文件嘛啊,小PU的文件啊。如果见不了索引,他就去蹭别人的,能理解这个意思了,你见不了索引,那我就去蹭别人了,这是插入的消息啊,然后蹭别人之后跟别人合并成新的一个文件片啊,那如果没有小小的基本文件可以蹭,那就一样自己写一个新的呗,新的文件组里面的新的片的新的。新的文件组的,新的文件片新的发回的好了,呃,这是见不了索引的时候啊,就生活不能自理呗,啊那如果你能够建索引,也就是说如果你用的是flink对吧,咱们就直接把这些联系起来,你就好理解了,如果你用的是flink,它基于状态可以对log fire键索引,他直接干嘛呢?它是追加log文件。
07:25
什么样的log呢?小的log。如果没有小的log文件可以蹭,那就自己开个新的呗,新的文件组的文件片的base好吧,能能不能理解这个意思啊,简单来讲,如果是插入消息,呃,如果log可以见索引。啊,就区分可不可以见,所有不可见他就去蹭人家的小帕奎。大家注意,蹭的是小PA,不可见索引蹭的是pack小的啊,然后合并成新的啊,如果蹭不了,就自己写入一个新的新的文件组就行了啊,那如果可以建索引啊,它也是蹭,但是他蹭的是什么小log文件,如果蹭不了就自己写一个新的啊,一样的道理,简单理解就是这样啊,那如果是更新的消息,这个就简单了,你也不用说蹭不蹭的了,你更新你就要找到你要你的老数据在哪对不对啊,他会写对应的这个fire group,还有对应的文件片啊,就老数据所在的位置啊,直接什么呢?呃,Aend的最新的log fire。
08:35
对吧。那如果刚巧是最小的小文件,也会进行一个合并,生成新的文件片啊,这个就你就不用管这个细节了啊,反正如果是更新消息,那就找到对应的是哪个组的啊,你是要更新的数据在哪个组啊。然后对应的新的文件片,然后去追加log就行了,呃,Log文件大打,因为你一直追加,你是不是不可能无限膨胀啊。
09:04
对吧,你一直在追加对吧,所以它达到一定的阈值,会做一个滚动啊,滚动生成一个新的漏洞,好吧,这个是upset的一些细节,其实你说它有用吧,也没用,但是方便我们去理解,呃,一些现象,比如说你去看HDFS的时候啊,就看到那些文件的。怎么有时候几个log,有时候又是怎么样怎么样,对吧,去方便理解。
我来说两句