00:00
接下来我们看第二种类型的表me read,也就是所谓的读时合并,那么大家注意它包含什么样的文件呢?第一,它可能有PA的文件,大家注意我的描述啊,是可能有。啊,可能有帕的文件,另外它一定会有一个基于行存的增量日志文件,也就是阿弗罗格式的,那么它具体的文件名呢,就会看到点log这么一个后缀啊,这个我们前面也是简单给大家看过,对吧?有一些点log,好,那为什么叫mor呢?那是因为它的合并在读取端,什么意思呢?诶,你看我现在是不是既有这个基本的列存文件叫回另外呢,还有每一次呃,新新增加的数据,比如说插入或者更新的数据,它这一批数据会记录在一个点log文件,对吧?那再来一个新批次,又这些数据又有插入有更新,它可能又在一个新的点log文件,也就是说在这张Mo表当中。
01:01
它是不是可能有PA,又有多个log,那你读的时候该怎么读啊?因为老的pack文件,它里面可能包含了一些是过期的数据,对吧?比如说我们原先这里有一条EA这么一条数据,然后后面我对它进行了呃更新,那我是不是有一条数据,比如说A变成B啊,变成EB啊,这是更新后的数据,那他过来他不会对原先pack回的文件进行处理,而是什么呢?将这一条更新的数据放在点log文件对吧?所以这个时候如果你只读这个PA,那可能是不准的,所以你要综合PA和点log文件啊。才能得到最新的结果,所以呢,我它这个Mo表就会在读取的时候也好,Log也好,它都会一起在读的时候进行合并,这也是为什么叫读时合并啊,只有在我进行读取操作的时候,我才会将pack跟log进行一个合并。
02:04
好,所以它的合并成本在读取端啊,它而且呢,它在写入的时候不会进行合并,或者说创建新的数据文件。对吧,这个就区别于Co表,它是写入的时候进行合并生成新的文件啊,那Mo不会啊,也就是相当于说是反过来了,当完成了标记索引之后,呃,对于具有要更新记录的现有数据文件,就像我刚才讲的那个例子啊,现有数据现有的那个帕啊,原先有一条数据是EA啊,那后面来了更新的数据要更新成B啊,它这个时候是创建增量日志。称量增量日志,就我刚才说的点log文件啊,它是放在这里的,OK啊好,那就像你看这一个文件组里面啊,有基本pack回,有基本not,那么大家要注意的一件事情是什么?一定有怕的吗?不一定,如果我这张互利表呃,是第一次有数据来,大家注意听我描述啊,这张表第一次有数据写入,也就第一批数据来,这个时候你没有怕回的文件吧,也就是说这个时候没有pack文件,第一批数据也是会追加到点log文件里面去啊,这个时候你就看不到park,就像我前面给大家看的时候,是不是也只有一个点log是吧?啊,当然呢,后面他,呃,对于Mo表有。
03:34
这个所谓的compassion啊,有不同的策略,不同的条件,当你满足这个合并的条件之后,或者执行合并的时候,就会将现有的呃pack和log进行一个合并成一个新的pack文件啊,这是compassion会做的事啊,那你看第一批数据来没有怕回的,那就正常点log呗啊,那第二批又是点log呗,第三批又点log啊,比如说我指定呃三个就会进行合并啊,那行啊,那现在三个他们就合并成一个。
04:06
啊,怕回的文件啊,就这个意思好行,我们具体看吧,呃,读取端将实时合并基本文件,也就是PA的及各自的增量日志文件啊,好了,每次的读取延迟都比较高,因为啊。我们要查询时才进行一个合并操作行,另外就是我刚才提到的压缩机制,也就是所谓的compassion,这个就是无论你读与否啊,有没有就是即使你没有读这个compassion,如果触发的话,它也是会进行啊文件的合并的啊,它会将数据文件pack啊,日志文件点log合并在一起,可以创建更新的pack啊,其实这个描述我刚才都讲过了。好,你看啊,原先呢,有基本文件,有log,有多个log,然后呢,执行compassion就会生成一个新的public文件啊,好吧,那关于这个compassion呢?呃,我们可以选择内联方式或者异步模式来运行啊,而且它提供了不同的压缩策略,那其中最常见的是基于什么提交的数量?
05:14
就像我刚才讲的,我每经过三次提交,每一次提交都会Mo表,每一次提交是不是都写入一个点log文件了,对吧?比如说我有三次提交,那就有三个点log文件,呃,那这个时候我指定数量为三就compassion,那它就会触发自己的compassion生成一个新的啊,这个就刚才唠过了啊。好。那么压缩完成之后,读取端只要读取最新的数据文件,而不用关心什么旧版的文件,这样是不是?呃,这种comp机制是不是可以减轻咱们读时合并的一个性能问题,对吧?如果你从来不做compassion,那我每一次读都必然要跟旧版的跟新版的,跟各种各多个log文件进行一个线合并啊,那效率就很低了啊,所以这个comparison也是很重要的一个事啊。
06:10
呃,那下面一些细节呢,就是什么呢?MO2表的写入行为根据索引会有一些区别啊,如果我们用的是布隆索引,它是无法对log.log这种文件生成索引的啊,所以这个时候他会怎么做呢?它会将插入的消息写入pack,将更新的消息写入这个点log。大家注意,这是针对布隆索引,为什么呢?因为它对阿芙罗这种log fire不能生成索引,那如果咱们用的是flink啊。啊,就是现象是不一样,这个大家要明白,如果用的是flink,它是基于状态的索引,那每次写入它都是log的一个格式,呃,并且会不断的追加,那这个时候他就不会说我insert的消息写入pocket update写入log,不是这样啊,它统一都写入什么log,追加到log,好这个是一些区别啊,那具体来讲就是回头咱们演示的时候啊,啊,如果咱们用Spark引擎,默认的不容过滤就可以是这样子啊ins色跟啊对是分开写,那么如果是flink,那就统一都写入到log啊好,这个就是MR表。
07:23
那么大家可以。想一想对吧,这两种表什么样的场景?呃,适合用什么表。
我来说两句