00:00
那么这个文件布局当中,我们还要了解一个他对文件的一个管理,因为我们知道忽底前面也聊了一些特性,它支持那个呃,版本控制。然后呢,又可以去做一些compass对吧。那这个时候就注意新版本跟老版本文件的一个问题了,那我们先了解一个概念啊,看这张图,呃,这个是一个分区路径啊,大家注意啊,外面这个大黑框表示的是某一个分区的护底表的某一个分区目录了,在一个分区当中,刚才带大家看的是不是有点log文件了啊,其实也有可能有点pack文件是吧?好,那他还做了一件事,他将这些pocket跟log封装成一个一个的,也不是封装了啊,就是划分为一个一个的文件组。大家注意叫文件组发group,那每一为什么叫group呢?因为它每一个组里面存储了多个文件片,每一个文件片代表一个版本,能理解吧?啊,比如说FIRELI1啊,这是老版本,FIRELI2就是现在目前最新的版本啊,那我们看一下具体的说明。
01:15
呃,护底将表组织成文件系统的目录,对吧?这个刚才看过了,表名就是目录名啊,分区也是个目录名,表位划分为多个分区对不对啊,分区是包含该分区的一个文件夹,类似于汉啊,这前面这两点好理解,在第三个啊,每个分区中文件被组织成什么文件组?另外有一个词大家记组由文件ID唯一标识,什么意思呢?啊,我在一个分区路径下可能有多个文件组,每一个文件组都有其对应的固定的ID,大家注意ID是固定的。每一个组有一个固定的文件ID啊,记住这一点啊,好,那每个文件组里面包含可能有多个文件片,叫fireli对吧?文件片啊,每个文件片包含什么呢?大家注意,一个基本文件点PA,这是列式存储多个日志文件点log的后缀。
02:13
啊,这是多个啊那么。正常来讲,呃,在一个基本文件就表示某一次提交或者合并后,在那个时刻生成的一个所有的数据啊,这不好理解是吧?啊,后续再来聊啊,也就是说正常的是有一个点pack文件的啊,要么是提交之后,要么是合并之后啊,会生成的pack的文件。呃,那么如果是点log文件,这是我们前面简单提到的是Mo这种表里面啊,它会有这种增量提交,那就是点not。这些日志文件就包含自生成基本文件以来对基本文件中的数据插入和更新啊,那cow没,没有,这个是copy on right啊,就写实拷贝,这是里面的两种表啊,回头我们后面会介绍啊。
03:13
先留个印象,说白了,文件片就是有pack回有log,能理解吧,Pack是一个,Log是多个啊。另外一件事就是为什么会有多个文件片呢?因为我们保存了多版本啊,多版本的数据,多版本并发控制啊。啊,那每一次compassion操作,它会合并这种点log文件,还有pack这种基本文件,产生新的什么文件片,诶大家注意这句话,当我执行一次compassion呢,啊,这些多个点到文件就会跟PA进行一次合并,生成一个大的新的PA的文件啊那这样的话,你看比如说他们,那他们呃,这个新生成的帕文件是不是就最新最全的数据啊。对吧?啊,这样就生成了一个新版本的一个一个数据文件,另外一我们知道instant里边有一种操作叫清理,对不对啊,它就会清理不使用的或者旧的文件片,对吧,已回收,因为可能我经过多次compassion之后啊,比如说我进行了十次compassion,那么这十次是不会每一次compassion都会对应一个新版本的数据文件生成,是不是那时间越久,这个compassion越多的话,你不可能所有的版本都存着,是不是,那肯定有个策略说,诶我我满足什么规则的,这些旧的版本文件片,我要把它清理掉啊,是有这么一个事儿,好。
04:40
另外注意一个事啊,那我们先来聊一下pack文件的一些细节,这个基本文件它在里面的foot的me里面去记录了什么record key,它里面用的是不能过滤啊。说白了就是有一个索引,同学们啊,有一个索引。
05:02
嗯。他这样通过这个东西就能高效的去检测这个record key在不在啊,只有不在的时候才去啊,需要去扫描整个文件去消灭假阳性,我们知道不容过滤是不是有假阳性,假阳性就是说不容过滤这种实现方式我们只能百分百确定啊。不存在。但是。如果不能过率显示存在,那是不是也有可能它不存在对吧,有一个假阳性率,或者咱们直白大白话来讲,就是有一个准确率的问题,你说不在,那就一定不在,但是你说在。那只能说可能在能理解这个意思吧,因为你说在是有准确率的啊,这个不容过率,呃,自个去了解了,它就有一个哈希函数,还有多个哈希函数,还还有K值啊,怎么样去计算,呃,总而言之,这一段话什么意思呢?也就是说呃,这个pack里面它记录了。
06:05
每一条数据的一个唯一key叫record key啊,这个词大家稍微记忆一下啊,会经常提到,经常用到啊record key举个例子啊,我有张表啊,别管分不分区呢,比如说我有数据123啊,1A2B3C这么三条数据吧,啊,那假如那么这三条数据刚好就在一个pack文件里面啊,啊,就别说刚好就是在一个pack文件里面,这个时候呢,其实呃,这个PA文件会记录一个索引的啊。所以啊。那我们可以基于布隆来做这个索引的查找,因为布隆布隆会快一点,并且节省空间嘛,效率高嘛,是不是啊布隆过滤,那这个时候呢,比诶比如说我现在要么更新或者插入,这个时候你是不是得嗯先判断一下。相同key的在不在,这个key是由咱们去呃,可以由我们去指定的啊,就是这个key,比如说EA这个key,我用第一列作为key,也就是说第一行的key是一,第二行K是二啊有点像什么,有点像关系型数据库里面那种组件这种概念能理解吧?啊类似于组件这个概念啊,有点类似啊,我只是说类似,好这个时候比如说我要插入一条二呃D的数据,那这个时候他会啊判断一下二这个K。
07:29
有没有啊,这个时候他通过这个索引机制,通过布隆的方式啊,就能判断到,诶,我这个二是存在的,那这个时候这条数据就可以单独去处理这条把它更新掉,这也是忽底实现,呃行式还有部分列的这upset的这种呃,很重要的索引机制啊,这个我在这里简单提一嘴啊,简单提一嘴。好,再看下一点啊,蝴地的log,也就是点log这种后缀的是阿弗罗格式的编码,对吧?它通过机攒buffer,并且以block block block为单位写出,也就是说它并不是一条一条写的,就想说这一点而已,而是攒一批数据,咱们去写一次log啊,那每一个呃,Log block一个,文件一个。
08:22
日志快吧啊,咱们叫log快吧,有一个魔法值大小上下文啊,文本,还有一个复等信息,用于读校验和过滤啊,当然这些事不需要我们去关心啊,这是它内部实现的一个机制,对吧?但是既然聊到就简单喽,呃,说一句啊,那下面这张图就很明显了,这是两种格式的文件,一种是pack,一种是log。那PA的一个文件重要特性就是会做一个什么,呃,文件的原数据里面会有一个索引啊,可以用布隆,可以用其他的索引方式啊。
09:01
那log就更复杂了,对吧,它记录了一堆东西啊。好,这个是文件布局啊,我们总结一下啊呃,其实总结就是这张图,还有上面这张图,第一个呢,就是我们在文件系统啊,是以什么方式存储的,一个表就是一个目录名对吧?一个分区也是个目录名,那跟呃表目录下除了分区目录,还有一个原数据目录,点互利啊就这就完了呗啊那每个分区目录里面啊是数据文件,要么是点park,要么是点log啊就这两种就完事了呗啊再往下走。呃,就是这里要注意湖底的一个多版本控制啊,就是每个分区路径下面,它是以文件组的方式来组织的啊,有多个文件组,每个文件组有一个唯一的ID啊,记住这一点啊,那每个文件组里面可能有多个文件片,每一个文件片包含了一个pack,多个log。
10:03
啊,具体有几个不一定,但park有的话也只会有一个log,可以有多个,呃,那这个时候呢,这样一组,呃,是一个版本对吧?当你进行合并啊,或者新提交啊,啊,生成一个新的版本啊,那最新最全的数据就在新版本里面嘛,啊那老的版本也是个文件片,新的版本也是一个文件片啊另外呢,有一个清理清理器对应的清理策略,会去清理旧的老的文件片啊这就完事了。嗯。
我来说两句