Hbase基础

1:Hbase概念
(1)table
table
columnfamily -列簇
column01,column02,… -列
rowkey -主键,每一条数据唯一的标识符
面向列的数据库,插入数据时:
rowkey + columnfamily + column + timestame : value —>统称为cell(单元)
表设计为宽表和高表:
宽表是指很多列较少行,即列多行少的表,一行中的数据量比较大,行数少;
高表是指很多行较少列,即行多列少,一行中的数据量较少,行数多。
(2)
rowkey:表中每行记录的主键,为了方便快速查找。是分布式的索引,也是分片的依据。
columnfamily:列簇名称,包含一个或多个相关列。
version number:默认值是系统时间戳,每一行有唯一的版本号。
value(cell):存储单元,以字节码形式存储。{rowkey,column(=+),version}。

2:Hbase物理模型
(1)table中所有的行都按照rowkey的字典顺序排序。
(2)table在行的方向上分割为多个region。
(3)region按大小分割,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阈值时,region就会等分分为2个新的region,之后会有越来越多的region。
(4)region是hbase中分布式存储和负载均衡的最小单元,但并不是存储的最小单元。不同的region分布到不同的regionserver上。
(5)region由一个或多个store组成,每个store保存一个column family(列簇)。即region是一行一行的数据,一个表有多少个列簇,一个region就有多少个store。
(6)每个store由一个memStore和0个或多个storefile组成。memStore存储在内存中,storefile是对存储数据文件(HFile)的轻量级封装,最终数据以HFile格式保存在HDFS上。

3:Hbase数据写入流程
(1)Client访问ZK,根据ROOT表获取meta表所在的Region的位置信息,并将该信息(元数据、Region位置信息等)写入Client Cache。
(2)Client读取meta表,根据meta表中查询到NameSpace、表名和RowKey等相关信息,获取将要写入Region的位置信息。
(3)Client向HRegionServer发出写请求,HRegionServer将数据先写入HLog(wal,预写日志),子再将数据写入MemStore。
(4)当MemStore中的数据达到阈值时,会将数据flush到磁盘中,并同时清空内存和HLog中的历史数据。
(5)将磁盘中的数据通过HFile来序列化,再将数据传输到HDFS进行存储,并对HLog进行一次标记。
(6)当HFile数量达到一定值时,会进行compact操作,合并成一个大的HFile。
(7)当一个region大小超过阈值时,会进行split操作,将拆分后的region重新分配到不同的HRegionServer进行管理。
(8)注:
MemStore是内存中的缓冲区,当数据量超过阈值时,将数据溢写到磁盘,生成一个storefile文件。
WAL用来排除故障。如果MemStore没有写满刷到磁盘上,那么内存中的数据就会丢失,应对办法是将数据在写完成前就写入WAL,每台节点维护一个WAL,直到WAL写入成功,写才算完成。同时,如果节点宕机恢复,MemStore里的数据会被自动从WAL中恢复到内存中。

4:Hbase读取数据流程
(1)Cilent访问ZK获取meta表中的元信息,得到要读取数据的region位置,并将meta缓存在客户端,用于后续操作(当一个HRegionServer宕机后,客户端要重新获取meta信息进行缓存)。
(2)Client向HRegionServer发出读请求。
(3)HRegionServer先从MemStore读取数据,如未查到就会到BlockCacke中查,再查不到就会访问磁盘中的HFile读取数据。
(4)注:Hbase读取数据中设计了一个BlockCache缓存,用来缓存从HFile中读入内存中最频繁的数据,避免磁盘读。

5:Hbase删除数据
(1)hbase的删除操作并不会立即将数据从磁盘上删除,主要是对被删除的数据打上标记。
(2)执行删除时,hbase新插入一条相同的KeyValue数据,但keytype=Delete,意味着数据被删除。等到region合并或者分裂的时候才会移除数据,数据才正真从磁盘删除,删除标记会从StroeFile删除。
(3)HTable表提供一个CAS原子操作: checkAndDelete()函数 在多个客户端对一行数据进行修改 保证数据的一致性。
(4)setWriteToWAL()方法。是否经该删除操作写入到WAL日志中。如果写入日志,现系统崩溃时可以进行数据恢复。如果不写入的话,发生系统崩溃,数据将无法进行恢复。
(5)setTTL()方法
设置一行数据的TTL时间,如果该行数据被设置,则当其时间超过TTL时,KeyValue数据会被删除。
Cell TTL处理和ColumnFamily TTL之间的差异:Cell TTL以毫秒不是秒为单位;Cell TTL不能超过ColumnFamily的TTL。

6:Hbase中StoreFile的Compact
Hbase MemStore每次flush操作都会产生新的HFile文件,文件越来越多,会带来性能问题。Hbase使用Compact机制来解决这个问题。Hbase的Compact分为minor compact和major compact。
(1)Minor compact
将一些小文件合并成大文件;
结果是文件数变少;
合并过程中进行排序;
不清理被标记为Deleted的数据和已过期的数据;
较小IO,速度快。
(2)Major Compact
将每个column family中所有的HFile进行合并重写为一个文件;
在合并过程中会清除标记为Deleted的cell和已过期的cell;
结果是每个column family一个HFile。
注:
为了提高读性能:要重写所有的文件,有大量的IO操作,一般安排在周末或凌晨负载小时进行。

7:Region分割(Split)
目的:实现数据访问的负载均衡。
做法:利用Middle Key将当前Region划分为两个等分的子Region。需要指出的是:Split会产生大量的I/O操作,Split开始前和Split完成后,HRegionServer都会通知HMaster。Split完成后,由于Region映射关系已变更,故HRegionServer会更新meta表。

8:Hbase宕机处理
(1) 宕机问题分析
Hbase的Regionserver进程随机挂掉(只是挂掉的Regionserver节点不同);
HMaster进程随机挂掉;
主备Namenode节点随机挂掉;
Zookeeper节点随机挂掉;
Zookeeper连接超时;
JVM GC睡眠时间过长;
datanode写入超时;
(2)解决该问题的方向
问题解决需从以下几个方面着手:
a、ZK连接超时相关参数调优:默认的ZK超时设置太短,一旦发生FULL GC,容易导致ZK连接超时;
b、Hbase的JVM GC相关参数调优:可以通过GC调优获得更好的GC性能,减少单次GC的时间和FULL GC频率;
c、HDFS读写数据相关参数需调优;
d、集群规划需优化:NameNode、NodeManager、DataNode,RegionServer会混用同一个节点,这样会导致这些关键的枢纽节点通信和内存压力过大,从而在计算压力 较大时容易发生异常。正确的做法是将枢纽节点(NameNode,ResourceManager,HMaster)和数据+计算节点分开;

你可能感兴趣的:(hbase)