Hbase存储设计

在Hbase中,表被分割成多个更小的块然后分散的存储在不同的服务器上,这些小块叫做Regions,存放Regions的地方叫做RegionServer。Master进程负责处理不同的RegionServer之间的Region的分发。在Hbase实现中HRegionServer和HRegion类代表RegionServer和Region。HRegionServer除了包含一些HRegions之外,还处理两种类型的文件用于数据存储

  • HLog 预写日志文件,也叫做WAL(write-ahead log)
  • HFile 真实的数据存储文件
Hbase存储设计
文章图片
image 在读数据的时候,客户端首先连接到ZooKeeper上面,然后查找"hbase:meta"表的位置,客户端查询"hbase:meta"表然后找到对应rowKey的Region,然后Region和RegionServer的信息缓存到客户端,在接下来的交互中就无需再次连接查询"hbase:meta"表了,如果缓存过期之后,客户端会发起一个新的查询,然后再缓存到本地。
Hlog(WAL)
在写数据的时候,数据首先被写到日志文件中(write-ahead log),然后写到MemStore中。直接写到MemStore很有可能导致数据丢失的问题,因为它存储在内容中。一旦MemStore满了,MemStore的内容就会刷新到磁盘中的HFile文件中。
在发生故障的时候,WAL的作用就显示出来了。因为WAL存储在HDFS上面,一般会有多份的复制,任何一个服务器有复制的WAL都可以使用。
Hlog类代表的是WAL,当构造HRegion对象的时候,Hlog的作为构造参数传递进去。在更新数据的时候,它直接保存数据到共享的WAL中,同时跟踪每一次编辑的序列化的改变。WAL使用Hadoop SequenceFile,存储记录为键值对。HLogKey作为Key,看下图为存储的键值对。
Hbase存储设计
文章图片
image HFile
Hfile代表真实的数据存储文件,这个文件包含不同数量的数据块和固定数量的文件信息块。索引块记录数据和元数据块的偏移量,每一个数据块包含魔数头和许多的KeyValue实例。
Hbase存储设计
文章图片
image 【Hbase存储设计】在Hbase中,每一个表都有它默认的目录,位于数据的/default目录,这个目录通过hbase.rootdir配置,每一个table目录包含一个文件叫做.tableinfo在.tabledesc目录下,.tableinfo目录存储表的元信息,例如表和列簇(HTableDescriptor类序列化)。
参考
  • HBase不睡觉书
  • [Hbase Essential]

    推荐阅读