00:00
好,接下来我们聊一聊这个H整个的一个架构,那之前呢也是一样的,每个班呢,都讲到这块的时候,第一遍听的时候都会比较晕,都比较晕,但是希望呢,还是大家认真听,认真听啊,听一遍熟。看一下。好,H base整体的一个架构,首先我们知道h base这个东西啊,是基于HDFS上构建出来的一个存储框架了,所以它这个底层呢,是这个GFS啊,核心GFS也是它的一个data not存储的,对吧,存储数据的,实际的存储数据我们都知道是data弄的那一样的,之前提过这个对动它其实是一个加va技能,对吧。我们只不过说习惯上说它直接是说它是一个来存储数据的地方吧,哎,实际上它是不能存储的,它这个管理的在什么linu系统上的那个文件夹嘛,哎,那些文件是由data not的这个进程来管理的啊,所以说我们表述上呢,大家也习以为常的,就说这个电动漏呢,存储数据的一样的,我们到h base当中呢,它也有一个这么个进程,也有这么进程,你要理解的内化器那上面呢,其实就是我们的这个h base。
01:12
H啊,那其实H整个的一个架构当中啊,你要想搭这个H想玩的话,它必须还要依赖于其他这个框架叫able,它会将很多这个原数据信息也会保存到开当中啊,也会保存到就类似于咱们卡普卡,卡普卡的一个集群的构建,对吧,是不是依赖于UK吧,或者说哈度的一个HHA。是不是也依赖于从K呀,将你的一个信息哎,都保存在K当中,那H一样,它有它的一个什么高可用,它也有多个那个主节点,然后它也有将原数据存放在那个足K当中,足K当中,OK,那所以它还会依赖于一个K。那它如果开有了之后,那我们就知道了,在起X倍之前,你要起的两个服务是什么。
02:00
一个ZK,一个哈是哈杜伯曼,哎,这两个东西一定要起的好,那这两个东西起了之后呢,就是到我们h base的一个领域了,那h base当中它有什么东西呢?就类似于我们卡法有什么消费者生产者,那h base当中它有什么呢?来看一下,首先它有一个master。那这个master一看就知道干什么用的吧,管理整个集群的对吧?啊,其实我们刚才提到这个高可用呢,其实也是这个master的高可用。啊,那你之前在ha就是哈多ha的时候,那你也是内部not的高可用法,没有提什么data note还是什么高可用法,对吧,它本身就是多副本的对吧?啊,所以说h base当中,它这个高可用呢,其实指的就是那个master的一个高可用,你叫h master或者叫master人家都知道,那这个H其实指的就是h base的意思啊,是这样的,OK,那这个master会将相应的数据存到voable,我们之前不是提到了h base会将什么原数据信息,还有什么高可用的信息存到u people吗?哎,这个信息是谁给的呢?是master给的,因为master是管理整个集群的,它掌握着整个集群的所有的原数据信息啊,所有的元数据信息是这样的啊好,然后接下来就到我们核心的没note下面是不是有什么带note什么小B啊,干活的小B对吧。
03:18
在H这当中,它也有这种实际干活的,因为我们之前所讲的啊,这base呢,它这个存储框架,那既然它这个存储框架呢,就涉及到客户端对他的一个读写请求对不对。哎,读写请求,那这个读写请求是谁处理的呢?就是这个reading so啊,或者你叫h sor也一样,也一样啊,就是reading sor,就类似于咱们下面这个对登实际处理业务的啊,之前也提到了它这个扩展性,一方面体现在这吧,就是来扩展啊这个对的存储数据对吧,第二方面是不是在这个reading s扩展它这个业务,业务层面上的一个扩展性。啊,So呢,它也是一个Java进程,也是一个Java进程啊,这个h master也是啊,所以说我们刚才表述的这个东西呢,它存储数据也跟对增动的一样,它也是维护了一些原数据信息吧,它其实还是指向了哪个Linux本地文件系统吧,还是存在Linux的啊,数据是这样的啊,然后这个reading so里边它是怎么来管理这些数据的呢?哎,它就比较复杂了,比较复杂了,因为它要对于HDF数据的一个随机读写,首先看第一个组件。
04:29
啊,这是h master会管理这个。首先第一个h log啊,这个h log呢是一个reading so里面有一个啊,就是reading so呢,你可以理解为一台一台的服务器是不是啊,一台服务器也就是一台服务器一个加入进程里面会有一个hlo,那hlo是个什么东西呢?大家知道那个MYSO当中的blog吗?没听过。它其实是一套这样,这个东西肯定知道,呃,HD当中有一个ID文件。
05:04
啊,对吧,那个I文件是什么?操作日志对吧,就是真的去改数据的时候,他先写到这个操作日志里边,那这个h log呢,其实就是跟那个是一样的,其实MY当中b log它也是操作日志它的一个事物,怎么说呢,就是根据那个b log来来回滚的log来回滚的就是跟这个h log一样,就是先写一个先写将你要做的操作啊写到一个文件里面保存下来。防止在内存当中丢失了吧,丢失了之后它可以按照这个文件来恢复。啊,你要记住的一个点就是hlo在当中呢,一台服务器只有一个。只有一个啊,这是一一对应的关系,OK,这个东西知道了对吧,哎,比较好好理解it就是编辑日志,因为我们啊这base也涉及到什么增加改查嘛,对吧,那增加改查的话,它有数据有可能丢失啊,它有一个编辑日志,那假如说丢失了内存的数据丢了,就放到编辑日志里边,就按照这个编程日志来恢复啊,这是第一个。
06:04
好,就这两个人搜这两边的一个东西都一样的啊,看一边就够了,看一遍就够了,那下面我们讲的什么看一下。Region。啊,这是个什么东西呢。这个理解一下,就是当中一张一张的表。它一个reading就相当于是一张表,能不能理解,因为我们之前都说了。HP它是一个big table嘛,它也有创建表嘛,对吧,它一个表呢,就是一个reading so,暂时这么理解,其实真正的它。一张表太大的时候,它还会切分,那就是一张表会对应于一个或多个水平在哪里解?就因为h base它是存大数据量的,对吧,数据量很大,当大到一定的程度之后呢。他就把这个表啊,刚才我们我不说了,这个一个reading对应一张表啊,就做切分啊,就做切分,就切成成两个reading,也就是说一张表啊,它对应于HP当中reading呢是一个或多个,当表很小的时候,它是一个,当很大的时候呢,它就是多个,这能不能理解?
07:12
不理解。云里雾里,云里雾里的是吧,好,首先这样你这样理解啊,就是一个预定的,就是对应一张表,这样能理解吧,啊暂时的这样去理解一下啊,其实它跟表有区别,区别就在于它这张表会做切分。会做切分,数量大的时候它会把它切开。会把它切开,而且既然它是表的话,HB当中不可能从一张表啊,对吧,那也就是说一个认so里边会维护多个点看到这个手机号的。这个能理解吧,那你们所有数据库里面也不可能存一张表啊,哎,HB也一样,它也不可能存一张表啊,所以说一个HB当中呢,它有很多个规定啊,很多个reading是这样的,第二个就是关于这个reading,它对应一张表,这个表很大的时候它会做切分。
08:00
啊,就形成了,又形成了不同的region不同,OK,那暂时呢,咱们就这样理解,就一个region呢,对应一张表,就当做小表来处理啊这样好理解一点,因为后面我们会讲整个的一个切分啊,整个的一个划分,怎么一个情况啊,都会讲,记住的,你现在一个微置就一张表,然后这个省略号呢,代表我的。整个HP当中会保存什么?很多很多的表啊,啊,会有很多很多的表,OK,然后这个HV这里面又有什么呢?它是一张表,那我们知道MYSO当中它是不是有什么列啊,然后有数据啊,对吧,那之前我们提过啊,这当中。他有什么?列足是不是,哎,它有列足,那列足体现在这个存储结构上是什么呢。对。这一个store其实对应的就是它的一个列读,能理解吧,哎,就是它列读,那这边它显示的有。多个store,那就说明一张表里边可以。
09:01
有多个列组是不是啊,有多个列组,就像你们搜索表里边你有多个列一样的啊,你有多个列,我有多个列组啊,多个列组,但是在H倍当中呢,它是将不同的列组啊分开存除的。分开存出的是这样的啊。就是说它不是一张表,所有的数据存在一个文件里边,它会将一张表的数据按照列存存在不同的文件里边啊,稍微理解一下,按照不同的列组存在不同的文件里边,它不是将一张表的所有数据放在一块啊,是这样的,所以是一个是一个组,还是什么东西,还是一个就是一个。列出列的家族。个列块的,然后呢是有什么标志,是说一个有标志,就是说你列征后面讲数据结构的会讲啊,就是你列怎么写,必须要加上列图名,然后加上列离这种方式,这个指这个才能指明一个列,假如说你是name这一列,它的CF加上它的一个。
10:05
列名啊,这个是指明了它一个列这个东西,假如说你单独写一个name,它不是叫HP当成一个列,列呢,是不能抛开列符单独存在的啊,所以说在HB当中呢,它是针对于这个列足来存储的啊,这个地方是多个列足啊,多个列足,然后它同样呢,它还可以更多嘛,那这个省略号的,这个省略号指的是做上面有更多啊,做上面有更多OK。好,这是到了裂缝的一个层面,它还能细啊,下面还有,然后是什么呢?他这个列足啊,是不是分成了一个一个的store,然后在这个store里边呢,它有一个memoryry store,那就很好理解了,Memoryry知道什么意思。对吧,内存级别的一个存储对吧?哎,内存级别的一个存储,OK,然后除了这个内存级别,它肯定还有文件嘛,它实际的是存到HDFS的,而DFS是存在磁盘的吧。
11:03
对吧,啊,这里把这个数据存在磁盘的,OK,它存在磁盘上叫什么呢。叫。就是这个东西它先进来一条数据,假如说是属于这个内存的,他先放到内存吧,先放它内存之后呢,它会有一个统一的时间,或者说大小这块啊,后面有相应的属性给大家看大小请求之后,他会将这个一个一个的memory缩啊。这放在内存还是不安全吧,第二个内存当中也有大小限制的,对吧?那你不可能把所有的数据都放到内存了,它最终还是要写到磁盘的,那写到磁盘之后它就叫store fair,这一个一个的storefa其实就是一个memory store1写刷写下来的flash,它里面有个flash过程。刷写下来的,由内存当中刷写到磁盘,这能理解吧,就是形成了一个一个的缩file,然后大家会看到这里面还有一个h file对吧?那h file是什么东西呢?大家学过什么OC park那个。对吧,这个H是跟这个平级的,它是这个缩在HDY上的存储格式。
12:06
啊,它是以HL这种形式存在,是第二导。它不是单独的一个什么,呃,Store fair又又又叫什么其他的名字,不是的,它是它的存储格式啊,其实这个store fair最终呢,其实是存在这个,通过这个调用HDFS的一个客户端,那这块跟HDF这个读写是不是找什么,那note找那note,然后请求说我这个数据应该放到哪找这弄的呀,哎,调用HTF一个客户端,将我们这一个一个的数据啊。就是这个store,哎,是以这个h file的形式存在了电上。啊,最终也就存在Linux的一个本地的一个文件系统上了,啊,本地的一个文件系统是这样的。这样的一个过程,OK,然后除此之外。这个h master其实整个的。刚才我们所说的这些事情,一个主导都是这个h master h master来做的,H master协调这些事情来做的,协调到对,然后这里面还有一个什么客户端,那客户端就是触发那些读写请求的吧,客户端是触发读写请求的,那这块一个东西呢就还好。
13:14
还好,那我们再回过头来,把这些东西再理一遍。是直接到这个h master这吧,因为前面那个东西没有什么太多可说的,首先你要知道它核心的有两种进程,一个是h master,还有一个是。Region sor对不对啊region so,那h master呢,是整整体管理这个什么集群的,对吧?管理集群的也就是管理这个region so的管理reading so怎么工作的啊,因为它里边细节的一个功能还很多还很多,OK,然后同样的它依赖于搜K呢,这个信息其实是h master给他的,因为h master掌管的这个集群的一个原数据信息,对吧?H master掌管的这个原数据信息啊,他给他一份啊,帮他维护着,帮他维护的,然后第二个组件就是我们所讲的这个VSO。
14:01
So,这个组件,那这个组件是不是它是实际的来处理这个控单请求的呀,无论你是读是写,都是由这个搜来做的,来做的啊,你要读,那我就从reading so拿出去给你,你要写,那我写到的是reading so当中。那写进来之后,既然有一个什么X帽对吧,那肯定是先写到哪啊。H log,而且h log是个什么东西,我也跟大家说了,它其实就是一个编辑日志,就是你任何的一个读写请求,那读就无所谓了,对吧?写请求的时候啊,就增加删除改啊,增加改操作的时候不有增加改查吗?查是不涉及到对于数据的一个更改,对吧?所以它不涉及到对的hlo的一个操作,那你要执行这个增删改的话,都会将你要做的操作先写到hlo。啊,先写大家知道吗?这个就是一个编辑日志,为了数据恢复的,为了数据恢复的那里边HVSO里边它是按什么来存的呢?是按一个一个的region。
15:03
一个日期里边会维护多个。Reading会多维护多个reading,那我之前提到这个reading类比下类似于我们当中什么。一张一张的表对吧,一张一张的表啊,其实它就是一个一张表,但是呢,它跟那个表有点区别啊那。就是我所讲的这个region啊,因为HP这个东西,它一张表里存的数据啊,是很多的,能够上上一条,那你如果上一条数据都在一个里边维护的。不太方便啊,不太方便,就太大了,这个数据量维护了,它就要加这个什么呢?定给它切分开啊,你太大了的时候把它切分开,切分到它就平均划分,将你的数据一分为二,分成两个reading点。啊,分成两个背景是这样的。分成两个锐定之后呢,它由h master会协调整个的一个h master会协调整个的一个负载均衡,负载均衡,因为你看啊,假如说我这张表叫T1,我这个人测叫T2,这没问题吧,它开始是两个都没有数据,它分别在X84呢,说反正都没有数据,你一人维护一个啊,一人维护一个,但是呢,你后期的生产操作当中呢,你一直往那个T表里边增加啊,增加了11条数据了。
16:20
他呢,还是什么300条。那这个时候你想想看,两个reading so之间是是不是严重的一个数据倾斜,对吧,严重的有问题了,所以说它为了避免这种情况,它当表达到一定的程度之后啊,它对这个表进行切分。切分出来的数据,它会将那个数据啊给另外的V来维护。给另外的维生座位来维护,这是为了处理负载均衡的啊,不是说他刻意的非要把这个表给切开干什么,就是因为太大了,他一个人维护呢,从的数据倾斜,所以呢,他要把数据一分为二,交给其他的。微生位来维护啊,维护这张表,那下一次请求的时候,你这地方假如说就是11秒,我一秒在这,我一条在这。
17:05
那如果说有读写请求的时候,想想看,对于前五一条是不是找他呀,对于后五一条找他呀,那你是不是读写就分开了呀,就不是由他一个人来做这个业务请求了吧。就能把它一个负载给它分分开啊,这是它要切分reading的一个目的所在,目的所在OK,那region里面呢,我们知道一张表,我直接提出它表里边存储结构是有列足是不是。对吧,它有列足,而且在HP当中呢,他不希望把多个列足啊,放在一个文件里面去存储。所以说它在这块存储的时候呢,它对于多个不同的列组,针对于每一个列组形成一个。结构关键叫动。叫so,就是一个so里边呢,会对应于一个列组,对应一个列组好注意看啊,那刚才所说的这个reading大到一定的程度之后,是不是会切分啊。
18:01
对吧,会切分,而且我提到切分呢,是按数据量平均切分的。平均线分的好。那刚才我说的或者说2000条吧,啊,2000条数据,假如说切分的话,它1000条零到1000是不是在第一个位置里边,1001~2000的第二个位置里面对吧,那你要注意你相应的这个立足呢。嗯。是不是这里面维护的是零到1000的两个例子。这个里边呢,又维护了两个电阻。它切分的时候,是不是这个列组也会被切分开。就你切表的时候会不会把列图切分开会吧。对,是平均分的,他他一切分的话,它就按照呃,后面会有个U,按照U的一个顺序平均切分的,就整个的平均切成了两个,平均切成两个,那你想想看,它这个刚才我们所提到的一个数对应一个列组,对吧,其实再想一下它跟表是一样的的。
19:02
就一个列图,真的跟这个so是一一对应的吗?你看啊,这两个东西刚才在切分之前是不是都是C1啊。这两个东西呢,千分之底下都是C方了。CF就是那个column family列列column family column不是列吗?Family啊,列的家族看CF1C2 OK,那在七分之前,就是零到这2000还由一个约定维护的时候,哎,这两个东西是不是在一块。那随着这个reading的切分,是不是实际上把这个。列祖给切开了呀。对吧,也就是说一个列组它会对应于一个或多个,这能不能理解。想一下啊,在切分在整个瑞切分之前,它是一一对应的关系,但是一旦触发了切分是不是很实际的切分的是数据啊,对吧,它切分的数据它就把这个什么。
20:09
给切开了。嗯,那个他把毒给切开了,那把给就给切开了,对呀,那切开了,那岂不是就这样看变成那个碎片,就是那种小的。对,是现在小的后面还有合并,后面合并对没关系,现在现在是之前瑞呢,是理解成一张表对吧?哎,这个表大的时候呢,它会进行切分,而且我们讲的这个切分规则,它是按照数据量。一刀切开的,一刀切开的,看一下。当时我们的表,假如说这种这种怎么办。我们的表呢?
21:03
嗯,我们的表呢,是这个样子的,最开始最原始的数据。它一行一行的对吧,但是它是基于列存储,就是中间有空的这一个表在这啊,这个表呢叫T1,我有两个列组,C1C2可以吧,当它数据量往上增,往上增,假如说增到2000的时候。攒到2000的时候,假如说它此差没有切分,那你想想看,之前我们所讲的一个store对应着一个C1吧,就这里边看啊。这里边的所有数据是不是在一个store里边维护着呢,对吧,这个又是一个store嘛,啊,就是我们在图上看到的那两个洞,两个洞OK,那到了两天之后,他进行切分,它是按数据进行切分的,他这样的这地方是1000。假如说这2000条都有OK,他从1000这个地方一到一切将数据这前1000条放在一个微里边,最后1000条放在一个微里边,那你想想看,这都两个在不同的reading里面了,这个地方又形成了一个新的store法,这个地方形成了一个新的store,但是这两个store里面数据是不是都属于C1啊,所以说一个列组随着reading定的一个切分也会将什么。
22:15
也会对应于多个store多个啊好,这对应于多个store啊,这个问题当然你看啊,此时这两个。是在一个reading里边吧,这两个数绝对不是同一个列。这两个东西我要理解为切分的是在它这个region内部哈。把了,不会的。他不会在内部将。这个列图进行切分,这个列图的切分一定是随着这个reading的切分的啊,随着reading切分的啊,它是横着一刀将数据。一分为二嘛,叫数据一分为二,所以它会切出来多个,也就是说这个东西啊,形成了一个,假如说形成了一个约定一。这个地方又来了一个瑞二,它这个二呢,有可能给另外的机器维护,对吧,那你想想看这个store是不是在另外一个里边,但是你要单独聊这个T表。
23:09
C1这个列足的时候,它是不是有两个store对吧?有两个store,这要注意的一个点,OK,然后这个store里边呢,它每一个store里边都有一个自己的memory store。啊,就是内存的一个存储啊,内存的一个存储就是说写数据来了之后,哎,它会先写到这个内存,先写到内存,它会有一定的触发机制,说什么什么时候时间到了呀,或者说这个内存满了呀,当然这个满了也是有一个限制一个配置属性的啊,那这块呢,满了之后它会刷写到磁盘,那这个地方我们提的叫刷写到磁盘,其实是刷写到哪了。刷写到HDFS啊,刷写到HDFS啊是这样的,那它刷写到HDFS之后呢,它叫多fair啊,它而且是以h fair这种形式来存储的。
24:00
形式来存储的。啊,是这样的一个过程,整个的这样的一个流程啊。这块呢,就目前这些东西大的方向还must so reading这些东西能记得了吧,啊,大致的要记一记,要记一记,能记多少记多少。那后面就是整个的刷写,刷写其实就是调用它只要触发了那个刷写,到了那个刷写的时候,假如说时间或者它这个大小到了的话,哎,它就调用关于h base hdfs的一个API,来将我们那个内存当中那个数据啊存到HDFS啊,存到HDFS是这样的一个过程。那有同学会说你这个东西是由一个一次内存当中写出来数据,一次内容写出来数据,对吧,那形成的这个H是不是很多很多啊,对吧,他而且一个还不大能感觉到吧,因为它这个内存当中数据你想想看能存多少呀。对吧,不大吧,而且你想想看,是一个慢形成了一个形成了一个。所以说它后面还有一个机制,就是会将这些小文件啊,会合并,会合并,但是合并的时候你要注意,它也是列足内部合并,它不会将这个ID跟这个I合并,因为它是不属于属于不同的列足的,能理解这个意思啊,到时候合并我们还会再讲它的一个机制,这块主要的是了解它一个整个的一个存储。
25:20
啊存储,所以说H整个的一个架构还是比较复杂的吧,还是比较复杂的,比其他的一些框架的一个架构要复杂很多。OK。
我来说两句