Hbase问题汇总2

1 HBase的物理结构???

HBase中所有数据文件存储在HDFS,主要有两种文件类型:

  • HFile:Hadoop的二进制格式文件,存储KeyValue数据
  • Hlog:HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File

StoreFile是对HFile的轻量级包装,即StoreFile底层就是HFile

2 HBase表物理存储

HBase表物理存储

Table中所有行都按照rowkey的字典序排序,Table 在行方向上分为多个Region

  • 行按照行键的字典序排列;
  • 表在行的方向上分割为多个Region(256M),Region按大小可以分割;
  • 每个表一开始只有一个Region,随着数据不断插入,Region不断增大,增大- - 到一定阈值,Region会等分为两个新的Region;当表中的行不断增多,就会有越来越多的Region。

Region由一个或者多个Store组成,每个Store保存一个column family
每个Store又由一个MemStore和0至多个StoreFile组成

  • MemStore存储在内存中
  • StoreFile以HFile格式保存在HDFS上

MemStore:用户写入的数据首先放入MemStore,MemStore满了会Flush成一个StoreFile(底层实现是HFile)

StoreFile:StoreFile文件数量增长到一定阈值,会触发Compact操作,将多个StoreFile合并成一个StoreFile

Compact:合并过程会进行版本合并和数据删除,HBase只增加数据,所有更新和删除都是在后续的compact过程中进行的

异步写入:用户写操作只要进入内存就可以立即返回,保证了HBase I/O的高性能

3 Hifle文件格式???

二进制格式文件,存储KeyValue数据,建立索引,提高读的效率
Trailer(指针,指向其他数据块)、Data Block Index、Data Block(魔数:信息校验+Key/Value 可以被压缩)

4 Hlog文件???

预写日志,将RegionServer插入和删除过程记录操作内容的日志,物理上是序列化文件,可用于灾难恢复;顺序写,减少磁盘寻址,定期删除。

每个RegionServer上所有Region维护一个HLog,不是每个Region一个
不同Region日志混在一起,只追加单个文件,数据按到达顺序写入,减少磁盘寻址次数,提供最好的IO
HLog文件会定期删除(已持久化到StoreFile中的数据)

5 HLog的日志恢复(Hlog Replay)

  • RegionServer挂掉,MemStore中数据会丢失。Master通过Zookeeper感知到RegionServer故障
  • Master将不同Region的Log数据进行拆分,并将失效的Region重新分配;
  • 领取到待恢复Region的RegionServer在Load Region时,会Replay HLog中的数据到MemStore;

6 合并和分裂(Compact And Split)

StoreFile Compact后,会形成越来越大的StoreFile;(合并:大合并和小合并)
单个StoreFile大小超过一定阈值后,会触发Split,把当前Region Split成2个Region;
父Region会下线,新Split出的2个Region会被Master分配到相应的RegionServer上;
原先1个Region的压力会分流到2个Region上。

7 容错机制

image.png

RegionServer上线
会在Zookeeper中注册自己
定时向Zookeeper汇报心跳
Master会订阅Server变更消息,感知各个Server健康状态
Master会向该Server迁移Region

RegionServer下线
Zookeeper自动释放此RegionServer的独占锁
Master收到RegionServer下线的通知
Master将该RegionServer上的Region重新分配到其他RegionServer上
Master将失效RegionServer上“预写”日志分割并发送给新的RegionServer
(Region的迁移是需要下线的,会暂时不可用,但是速度快,不会对数据的读写造成影响)

Master上线
从Zookeeper上获取一个代表主Master的锁,用来阻止其它Master成为主Master
扫描Zookeeper上的Server目录,获得当前可用的Server列表
和每个Server通信,获得当前已分配的Region和Server的对应关系
扫描.META.Region的集合,计算得到当前还未分配的Region,将他们放入待分配Region列表

Master下线
Master只维护表和Region的元数据,表数据读写还可以正常进行
Master下线仅导致所有元数据修改被冻结
无法创建删除表
无法进行Region的负载均衡
无法处理Region上下线
Zookeeper重新选择一个主Master

8 Region的定位?

HBase中有两张特殊的Table:
Zookeeper:记录了-ROOT-表的location

-ROOT-
记录了.META.表的Region信息,-ROOT-只有一个Region

.META.
记录了用户表的Region信息,.META.可以有多个Region;保存Region和RegionServer的映射关系

系统如何找到某个RowKey(或者RowKey Range)所在的Region

  • -ROOT-表保存所有.META.表所在Region的位置, 此表不会拆分,只有一个Region,保证了只需要三次跳转,就能定位到任意Region
  • .META.表每行保存一个用户表Region的位置信息
  • 为了加快访问,.META.表的全部Region都保存在内存中
  • Client将查询过的位置信息缓存起来

9 HBase读写过程

读请求时,需要访问Store中全部的StoreFile和MemStore,将他们按照Rowkey进行合并
StoreFile和MemStore都是经过排序的,并且StoreFile带有内存索引,合并过程比较快

StoreFile是只读文件,创建后不可修改
HBase的更新和删除其实是不断追加
当StoreFile文件数达到一定的阈值后,就会进行一次合并(compact),形成一个大的StoreFile,并执行修改和删除操作
当StoreFile大小达到一定阈值后,会对StoreFile进行Split,等分为两个StoreFile

客户端发起Put请求,写入WriteBuffer,如果是批量提交,写满缓存后自动提交
客户端根据Rowkey将put分发给不同RegionServer
RegionServer将put按Rowkey分给不同的Region
Region首先把数据写入WAL
WAL写入成功后,把数据写入MemStore
MemStore写完后,检查MemStore大小是否达到flush阈值
如果达到flush阈值,将MemStore写入HDFS,生成HFile文件

更新

使用MemStore和StoreFile存储对表的更新
更新时首先写入HLog和MemStore(数据是排序的)
当MemStore到一定阈值,创建一个新的MemStore,将老的MemStore flush到磁盘,生成一个StoreFile
系统会在Zookeeper中记录一个Redo Point,表示这个时刻之前的变更已经持久化了
系统出现故障,导致MemStore中的数据丢失,此时使用HLog来恢复数据

你可能感兴趣的:(Hbase问题汇总2)