Hbase 概念扫盲

前言

之前用过一段时间的HBase,回过头看看,发现自己很多东西要么忘光了,要么没记住,所以先把这些概念理清楚,不然不也白接触了么。Hbase作为一个高吞吐,存储量大,可扩展性好,它是怎么做到的呢?首先,它大部分的时候,依赖于Hadoop的分布式存储方案HDFS,HDFS的设计初衷就是为了方便水平扩展。Hbase依赖于它,将物理数据落户HDFS。为了高可用,Hbase采用了Region来作为其最小访问单元。就像一个人一样,这是个单元。起初默认是一个,随着数据量的增长,它会分裂,就相当于一个人忙活不过来,找人帮忙。基于这样的思想,Hbase在高可用上,高吞吐上还是很不错的,下面,我对这些概念总结一下,防止自己忘记


Hbase Hmaster :

  1.负责region的分配 表的ddl(创建表 删除表)  启动时分配regions

  2.监控集群中所有region server实例  从ZK中获取

zookeeper: 

  zk是Hbase依赖的其中一个中间件。它记录了Hbase 哪些Server是可用的。每个Region Server 会再ZK上面注册一个临时节点

    主要是注册了临时节点的server,都会和zk维持一个心跳。当server下线的时候,临时节点会消失,这时候,ZK会通知HMaster去恢复,当有Hmaster掉线的时候,ZK会通知备用节点,备用节点会竞争上线成为新的HMaster

Hbase Meta table:

meta table 是一个特殊的Hbase table .它保存了所有的Region 列表

key: table region start key  regionId,  value:region server

Region Server :

  负责管理Region的节点(机器,可用是物理机,也可以是虚拟机) Region是运行在data node 上面的

  Region:

            1.Htable会被水平拆分成一个或者数个regions。每个region包含了连续的,有序的一段rows,以start key end key 为边界

            2.每个region默认为1G

            3.region里的数据由Region Server负责读写,和client进行交互

            4.每个region server 可以管理管理约1000个regions

  WAL:写入日志,是Hdfs上面的一个文件,用来存储新的还未被持久化的数据,用来恢复故障

  block cache: 读缓存,在内存中存储了最常访问的数据 (相当于本地文件系统的读缓冲区)

memStore: 写缓存,在内存中存储了新的还未被持久化的数据 (相当于本地文件系统的写缓冲区)

  Hfile : 在HDFS上面存储数据,以key/value的方式

Region 分裂:

  一开始每个table默认只有一个region。当一个region逐渐变大的时候,他会split成两个子region,这个分裂动作会报告给Hmaster.

处于负载均衡的目的,hmaster可能会把他们分配到别的节点上。这样也会导致一个问题,就是数据可能会访问比较远的HDFS数据 ,后面会出现合并,会进行重新迁移,确保数据正确访问

第一次读写操作:

1. 从zk中获取哪一台Region Server负责管理Meta Table

2.客户端从 Meta table中的查询rowkey 所在的 region server  以上的请求可用缓存到本地

3.客户端访问具体的RegionServer,拉取数据

后续的请求,客户端可以从缓存中获取region server, 然后直接去访问数据节点 ,如果查不到数据,会从第一步开始做起

整个请求大致为两个步骤,一个是获取RegionServer地址,第二是去RegionServer读取数据

Hbase写入过程:

1.新数据会写入WAL文件底部,WAL文件可用用来恢复故障未持久化的数据

2.数据写入WAL后,然后再写入到MenStore中,然后服务端向客户端返回ask,通知客户端写入数据完成

这个过程和数据写入本地文件其实是类似的,数据写入本地文件系统,是先写入写缓冲区,然后最终flush磁盘,我们再写入缓冲区后就顺利的获取到文件写入成功的返回

Hbse MemStore: 

MemStore 再内存中缓存Hbase数据更新,以有序的key values的形式,和Hfile一样,记录了数据最新的更改

Hbase Region Flush: 

MemStore累计了足够多的数据以后,会整体的将数据写入到HFile上,最终落盘HDFS文件系统。Hbase会为每个Column Family创建一个HFile。同时,它记录着写入的数据的最大序列号,最大序列号是递增的,同时也是HFile的一个meta信息,存储在HFile中。这样,系统 就清楚了,哪些数据被持久化了。在故障恢复的时候,就可以通过wal和最大序列号的差异,来进行数据操作,保证数据恢复

HFile:               

数据存储在HFile上,同样是以K/V的形式保存。HFile把MemStore中的数据顺序写入,由于HDFS支持文件的append操作,所有写入性能还是不错的。 HFile采用了多层索引的方式,来存储数据,多层索引,以B+TREE的方式存储,最终树上的每个节点都会指向一个dataBolck而这些索引中的信息,会被加载到block cache中

Hbase read合并:

在HBase中,一个rowkey的数据可能在不同的区域都会有,可能会在Block Cache中,也可能在MemStore中(刚刚写入的新数据),在原先 HFile中数据有可能也会保存一份,为了确保读取数据的准确性,在读取的时候,会对数据进行合并。

1.首先读取block cache的数据,经常被读取的数据会出现在这个缓存区域

2.读取memstore,获取最新写入的数据

3.如果上述步骤没有找到数据,会加载Block cache中的索引,然后到对应的HFile到内存,查找对应的数据

Hbase HFile 合并:

1. Hbase 会自动合并一些小的HFile,重写成少量更大的HFiles。这个过程,就是小文件合并成大文件,有效减少文件数量

2. 合并重写每个column family下的所有的HFiles,成为一个单独的HFile,这个过程主要会清理哪些被删除的或者过期的数据,这个过程会重新所有的HFile,这会产生大量的网络开销和磁盘开销 。还有一个作用,就算以为负载均衡,Region被重新分配到另外一个节点上,合并的时候,会把Region迁移到对应的附件的HFile上

你可能感兴趣的:(Hbase 概念扫盲)