00:00
好,那我们把头一天的所讲的东西做一个回顾啊呃,我们之前呢,是从这个Fla开始讲啊flash,那我们想一下flash它指的是将我们marry里的内容给它写到。磁盘也就其实写到IDFS对吧,写到IDFS的本质实际上还是写到哪了,磁盘啊落盘啊,做一个永久性存储,就这意思,因为在内存当中它容易丢啊,它容易丢,OK,那我们想一下触发条件。还记得吗?啊,有几个条件,就是总的有时间和大小,数据量大小的积分吧,啊那时间上面呢,一个小时对吧,一个小时,而且跟大家说了指的是什么?一个小时,对最后一次编辑时间啊,最后一次编辑时间内超过了一个小时他就会写出去啊不是说你这条数据放在里面,放一个小时了,我就写出去一条,不是这样的,他一写呢,整个当前这个内存都要写出去,对吧?好,那大小的它有两个级别是吧。
01:09
一个是我们所说的reading级别的,还有一个是reading级别的,对吧,Reading级别的。有两个参数,一个是我们所看到的40%,还有一个0.95,对吧,这0.95实际上如果说这样算的话,应该乘以一个0.4对吧,他们俩都要乘以一个谁呀。堆内存大小对吧,他们俩都是一样的,都要乘一个堆内存大小。啊,对于内存大小,其实实际上它到这个阈值的时候,他会去。到当前这个值的时候,这个下线的时候开始刷写对吧,按刷写,当然如果说它的一个刷写速度比写入速度慢,注意刷写速度比写入速度慢,这个内存是不是还在涨啊,对吧?啊还在涨,那还在长的时候,是不是有可能会超过这个值对吧?那这个时候就要干什么,你去阻塞写了对吧?啊阻塞写了就是不让客户端再接着写了,因为。
02:11
因为此时已经发现了,你外部写进来比我从内部写出去还要快,是不是你再往下写的时候容易内存容易崩啊,对吧,它就阻塞了,一直到你降到这个下面之后。啊,再接着才把那个相当于打开一个锁,对吧?啊,打开锁让你去继续写这个内容,最后一个是我们所说的reading级别的。啊,瑞定级别的,瑞正级别的,它指的是什么。大小百二八兆指的是单个瑞达到128兆这个瑞这里边的所有的一起。啊,之前我们看到的reading so级别的,一旦达到这个值,是所有的reading so里面的值都要去一写,直播在来一写的过程当中呢,它会对我们多个内存做一个排序,排序重要的规则呢,就看内存大小啊,他会选择先溢写大的啊,先溢写大的,因为你把一些大的一写下去之后,对于空间的一个释放是不是最有作用的,对吧?啊是这意思,所以呢,这个整个的是flash过程当中一个点,之后呢,是我们所聊的读流程,读流程呢,中间大家一定要关注的就是这两块东西。
03:22
他是同时读的啊,它是同时读的这块,呃,之前呢,应该是有一个扩展资料放在这儿啊。资料,然后有一个扩展,扩展里面这个其实你们手上都已经有了啊,首先都有了,这个就是我们所说的B构建scanner的一个过程,但是这个呢,就画不下去啊,所以就画成这个样子。啊,你看就是从这个地方开始。然后然后就这这这过来了,对吧,也就是说他去扫描一个值的时候,大致的说一下扫描一个值的时候。就看你过滤的是你因为你扫描的时候可以指定扫描哪个列啊,或者说你get的时候,Get里边指定的列图,那这里边有两个列图,这个列图还会去扫描吗。
04:09
不会,压根就不会了,不管是内存还是说什么400都不会去走了,他都会走,他就只会走这个内容。然后接下来这个内容当中,我们之前说过,它的一个数据存储应该在两个地方嘛。一个文件,一个什么内存,然后然后呢,它就同时去构建so scan和memory scan。啊,然后扫描他,他想要的这个值啊,假如说这里边恰好没有值,对吧,他就没了,到下一步他拿到自己的什么。过滤出来的文件啊,过滤出来的这个数据啊,过滤数据,最后做一个合并,最后做一个合并,合并里面干什么事的,我们之前所讲的。按时间戳来吧,啊,就看时间戳的啊,实际上它整个的过程呢,这两个是同时构建的,就是说memory store跟这个。
05:01
多费啊,这两个东西同时构建的,因为原因也跟大家说的很清楚了,其实这块代码呢,没有带大家去看,但是呢,我们当时做了一个案例,对吧。哎,我总感觉这个麦。什么?后面的人能听清是吧。啊,听得清就行,听得就行,听不清还听听得清啊。没电了,OK,那我们当时做了一个案例,这个案例怎么做的,还记得吗?就如何来证明这个事情,我这样做的,我先获得了一个张三。对吧,把它刷写下去,手动刷写的它就变成了一个文件,而且我第二次做实验的时候,是不是连这个时间戳我都没拿了。我连时间说,因为我就不查它,我就防止大家想着可能有内存缓存对吧,你你查了一下,可能在缓存里边缓存着呢,啊在在内存级别,所以他拿了一下,而且呢,我做完这个事情之后,当然记得我把客户端整个都关掉了。
06:08
对吧,我重新启动的那个HB的一个客户端,完完事之后我干了什么事啊。我写了一个李四吧,写了一个李四,而且没有去执行这个。然后直接查,查的时候谁出来了。张三出来了,而且这个插入李四的时候有一个点,就是它这个时间戳,我们插入的时候比这个张三什么小对吧?啊张三小,如果说像我们认知的一样。如果说先走的是内存,后走的是文件,那么一定会出现的是谁啊李四对吧,所以呢,它两个呢去同时扫描的,然后拿过来做一个墨纸啊,做一个墨指,就是我们刚才所讲的那个点。啊,取时间中最大的,啊取时间中最大的,也是由于这个点才导致他整个的读笔写脉,因为他其实还要去大量的扫描这个文件,尽管他用了block catchche来加速,对吧,这个确实有一定的作用,同时这块还有什么?
07:08
原数据的一个缓存来加速它这个查询,同时在服务端这边,对于最近常用的一些数据呢,也做了缓存,但是它还是避免不了去扫描这个什么文件,假如说我读的你这个block catch里面没有呢。只能还是扫描文件吧,但是写的时候写的时候啊,写的时候他是把那个数据第一部分呢,直接。把操作步骤写到内存里边。操作步骤不是写到内存,然后之后再同步吧,这两步对吧?啊,其实实际上他是把那个我们所说的h log要写到HDFS,那这个也跟文件打交道了,也跟文件打交道,但是它仅仅是做追加。仅仅是做追加,因为它这个内容呢,只要追加就够了吧,它不涉及到对前面的数据一个改,但是这个地方你说扫描这个store fair,但是你要查的是某一个rookie的值,或者说某一堆start Rose stop row,对吧,某一堆这个rie的值,你是不是要对这个里边进行一个什么。
08:08
扫描啊啊进行扫描,进行进行一个全面扫描是这个意思啊,所以呢,它整个的过程当中呢,读就显得很慢了啊,读就显得很慢了,OK,那后面是我们所聊的这两个过程,这两个过程相对来说啊,没有前面我们说的那几个过程要重要啊,它因为这几个东西呢,包括这个flash啊,是属于。贝斯自己要做的一件事情。对吧,呃,不希望你去干预的,不希望你去干预的,但是这里面有一个点,我们还真要干预一下。还记得吗?这个地方。合并的时候。有一个东西七天那个纸是不是我们在生产环境当中一定要干一下,对吧,把它设置为零,把它设置为零,不让它自动合并,而且你跟他说了这个合并呢,它是major合并。啊,不管你两个文件,还有三个文件,多少个文件,都把它干什么合并到一块,注意我这个说的都合并到一块,不要理解错了,它指的是单个的做里面,也就是单个列足的东西,合并块能听懂吗?它不会说把多个列组的值也合并单方这个不会啊,因为多个列组的东西它还是放在不同的文件夹里面去存着的,它不可能把这个两个文件夹里边东西合并到一块啊,是这意思,所以呢,把这个纸给它关闭掉啊,关闭掉那合并的时候。
09:27
还会删除数据吧,啊是我们所聊的最后这个切分,这个切分相对来说更不重要了,因为到了生产环境当中,我们今天就会讲一个叫预分区啊,预分区尽量的不让他去干什么,按照自己的规则来切分,因为按照自己的规则来切分的时候,它可能会产生什么数据清洗啊,数据清斜,我们今天说了会引发热点问题啊,就是热点问题。热点问题指的是客户端的请求。都集中到某一台机器上,这个叫热点问题,能懂啊好,那之后呢,说我们所聊的数据真正删除的一个什么。
10:03
时机,两个过程吧。一个是flash过者会删除数据,还有一个是我们所说的major com对吧?啊,他官网上说了那个小的呢,它不会去个什么删除数据啊,在这个flash的时候,它会删除什么样的数据,同一个内存当中,它就能判断出来这个数据是不要的,对吧?如果说你是互相覆盖的,或者说有删除标记,然后删除标记比删除标记时间中小的,还有实际数据的时候,这个时候把这个被覆盖掉的和这个删掉吧,啊和这个都删掉,那不能删的。就当前你这个内存当中最大的那个时间戳它不会删掉,对吧,还有这个删除标记它也干什么。不会删掉啊,不会删掉这意思,那到什么时候会去删啊,假如说这些东西在大合并的时候吧,啊,因为我们所说的大合并的时候呢,它是将所有的文件给它读进来,要red重写回去吧,啊重写回去,因为这个时候是不是所有的数据都能见面在内存里边对吧?啊,它是把所有的数据呢,按照这个rie把所有的数据拿到,然后呢,看你保存的是几个,就是你当前这张表。
11:15
关于这个列族写的,当时建表的时候,或者说最后修改的时候,保存的是几个版本,对吧,他假如说你保存的是两个版本。或者一个版本这些是不一样的,假如说我多个文件,五个文件,每一个文件里边关于这个列就是1001O,假如说这个name这一列啊,五个文件,每一个文件里面都有一个值,那合并的时候它会保留什么?最大的两个版本啊,他只会保留最大的一个版本,而且我们今天说了,他这个地方的一个版本指的是。哎,这辈子这个内容为我们提供的一个服务,对吧,提供了什么样的服务。就是将来给你保存最大的版本数。
12:01
啊,给你保留最大的版本数,我们这边看到了你负的张三,负的李四。你把它都put下去之后啊,或者说你put张三,Put李四,然后再做同时做flash,这个时候张三是不是没了啊,我们按照时间顺序,但如果说你两个版本的话,那这两个都会保留,因为它会保留两个最大的版本啊,两个最大的版本这个要注意一下,这个是我们所聊的数据真正删除的过程啊,聊到这块之后,其实大家也比较清楚那个点啊,我们之前所说的,但凡你想在HDFS上实现随机写的一个功能,那都是一样的。读下来对吧,写改完了写回去啊,写回去是这个过程,人家H也是这样做的,只不过说呢,他用时间桌来做了它的一个优化啊,做了一个优化,当然这里边还有一个不好的点嘛,就时间桌做的优化还有一个不好的点啊,等会我们写那个API的时候,删除API的时候,大家就能看见,所以呢,大家要尽量的避免这种写法,因为S它是采用时间中来控制这个事情的,他没办法避免这个事情发生啊,到时候会跟大家说一下,如果说你对这个API删除的API应用不好的话,你在公司当中,生产环境当中应用的时候,你会发现很奇怪的现象。
13:10
啊,很奇怪现象,到时候我们会提醒大家注意的啊,因为就是因为他用的这个时间不是现场去改的。如果说他现场去改这个事情的话,不会有那种问题的一个发生啊好,那这个时候我们所聊的这个API的一些操作。呃,这个API呢,当时我们也讲了,分为DDL和DM吧,数据库和表啊,这个呢,是实际的数据对吧?啊,这个是NS和表啊,或者叫叫这个数据库也可以,那这里边有一个点我们需要关注一下,呃,就是。这个。应该是我们所聊的插入数据,因为我们写的插入数据和获取单行数据对吧,这两个我们讲过了就get,大家有没有发现。负的对象。它跟什么东一对应呢。
14:02
Rookie是不是?因为你在new put的时候,它是不是传一个rookie进面对吧,也就是rookie对应一个put比较那get呢。是不是也是一样的呀,对吧?好,那大家还记不记得我们通过get。点get的方法,传一个get的对象进去,返回值还记得是什么吗?嗯。是不是result对吧?啊啊是这个东西,其实我们还能看到,如果通过get一个list get集合进去,返回值是什么。Result的一个数组,那这个地方也反映了result其实跟我们RK是不是也是一一对应的关系,对吧?那为什么要说这个点呢?因为等会我们要写SKYSKY扫描是不是多个什么。Rookie吧,多个rookie,那返回的结果你猜一下。是不是理论上说应该是result的一个数组啊,对吧,但是它这个地方呢,用数组不太好。
15:04
用数组,用集合这种东西都不太好,为什么?因为你盖扫描的这个数据啊,数据量太大了。大家都知道数组啊,集合这东西是不是直接放在内存的?对吧,他用的是一个特殊的一个类,就是说呃,你假如说有100万条数据,我根据你客户端的一个缓存不断的去放到这个缓存里边啊,就类似于迭代器那种感觉,不是说一下子所有的东西全部给你放到缓存里面,如果说几十一条数据,你代码调用了盖,你想想看你客户端这块是不是会崩。你一般客户端的内存不会设的特别大吧,对吧,所以呢,并不是大家想的看到的数组啊,或者集合这种东西。这个麦又好了是吧。所以说不是看到出组啊集合这种东西啊,等会呢,它它是一个特殊类型,但是它本质还是result一个集合。能理解这个事儿吗?它里面放的肯定还是多个result,因为我们是通过这个什么rookie来找对应关系的啊,来找对应关系的,OK,这个里边的API呢,也就不回顾了啊,也不回了,因为我们说完之后呢,再给大家再总结一下这个API到时候怎么怎么去记,怎么去写,对吧啊。
16:12
嗯。
我来说两句