HBase架构详解

HBase架构详解

Hbase架构

Hbase组件

client

  • 整个Hbase集群的入口
  • 使用Hbase RPC机制与HMaster和HRegionserver通信
  • 与HMaster通信进行管理类的操作
  • 与HRegionserver通信进行读写类操作
  • 包含访问HBase的接口,并维护cache来加快对HBase的访问,与HRegionserver交互

程序协调服务ZooKeeper

  • 保证任何时候,集群中只有一个Master(HA)
  • 存贮所有Region的寻址入口
  • 实时监控Region server的上线和下线信息.并实时通知给Master
  • 存储Hbase的schema和table元数据

Hbase主节点Master

  • 管理用户对Table的增删改查操作
  • 管理HRegionServer的负载均衡,调整Region分布
  • 在Region Split后,负责新Region的分配
  • 在HRegionServer停机后,负责失效HRegionServer上的Region迁移
  • HHMaster失效仅会导致所有元数据无法被修改,表的数据读写还是可以正常进行

HRegionServer节点

  • 维护Hregion并往HDFS中写数据
  • 当表的大小超过设置值的时候,Split Hregion
  • 在HRegionServer停机后,负责失效HRegionServer上的Region迁移

Hbase架构

Hbase与ZooKeeper

  • Hbase元数据存储在ZooKeeper中
  • 默认情况下,HBase管理ZooKeeper实例,比如,启动或者停止ZooKeeper
  • Zookeeper解决HBase单节点故障问题
  • HMaster与HRegionserver启动时会向Zookeeper注册

寻找RegionServer过程详解

  • ZooKeeper (读取Zookeeper找到-ROOT-表的位置)
  • -ROOT-(-ROOT-表包含.METAA.表所在的region列表,该表只会有一个Region;Zookeeper中记录了-ROOT-表的location)
  • .META.(.META.表包含所有的用户空间region列表,以及RegionServer的服务器地址)
  • 用户表
  • Client第一次操作后,会将-ROOT-和.META.缓存到本地,不需要再访问Zookeeper

Hbase容错性

  • Master容错: Zookeeper 重新选择一个新的Master
    • 无Master过程中,数据读取仍照正常进行
    • 无Master过程中,region切分,负载均衡等无法进行
  • RegionServer容错: 定时向Zookeeper汇报心跳,如果一段时间内出现心跳
    • Master将该RegionServer上的Region重新分配到其他RegionServer上
    • 失效服务器上”预写”日志由主服务器进行分割并派送给新的RegionServer
  • Zookeeper容错
    • Zookeeper高可靠的服务,不存在单点故障

Hbase数据存储

  • HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:
    • HFile: HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
    • HLog File: HBase 中WAL(Write Ahead Log)的存储格式,物理上是Hadoop的Sequence File带项目符号的内容

HRegionServer

  • HRegionServer管理一些列HRegion对象
  • 每个HRegion对应Table中的一个Region,HRegion由多个HStore组成
  • 每个HStore对应Table中一个Column Family的存储
  • Column Family就是一个集中的额存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效

HStore (MemStore 和 StoreFile)

  • Client写入 -> 存储MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 触发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,被分割的Region会下线,新Split出2个子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上
  • HBase只是增加数据,所有的更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能

StoreFile文件结构

  • StoreFile以HFile格式保存在HDFS上
  • Data Block段:保存表中的额数据,这部分可以被压缩
  • Meta Block段(可选的):保存用户自定义的kv对,可以被压缩
  • File Info 段:Hfile的元信息,不压缩 ,用户也可以在这一部分添加自己的元信息
  • Data Block Index 段:Data Block的索引.每条索引的key是被索引的block的第一条记录的key
  • Meta Block Index段(可选的):Meta Block的索引
  • Trailer:这一段是定长的,保存的是每一段的偏移量

压缩

  • HFile的Data Block,Meta Block通常采用压缩方式存储
    • 好处: 压缩之后可以大大减小网络IO和磁盘IO
    • 坏处: 需要花费CPU进行压缩和解压缩
  • Hfile支持的压缩格式: Gzip,Lzo,Snappy…

KeyValue 存储结构

  • HFile里面的每个KeyValue对就是一个简单的byte数组
  • KeyLength和ValueLength: 两个固定的长度,分别代表key和value的长度
  • Key部分: RowLength是固定长度的数值,表示RowKey的长度,Row就是RowKey
  • Column Family Length是固定长度的数值,表示Family的长度,接着就是Column Family,再接着就是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)
  • Value部分没有这么复杂的结构,就是纯粹的二进制数据

HLog文件结构

  • HLog文件就是一个普通的Hadoop sequence File,Sequence File 的Key就是HLogKey对象,HLogkey中记录了写入数据的归属信息,除了table和region名字外,同时还包括sequence number和timestamp,timestamp是”写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number.
  • HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue

Hbase内部表

Hbase内部表

  • -ROOT-表
    • 存储.meta.表信息,-ROOT-表中仅有一行数据
    • Zookeeper中存储了-ROOT-表的位置信息
  • .META.表
    • 主要存储HRegin的列表和HRegionServer的服务器地址
  • Namespace表
    • 存储命名空间

hbck修复错误表

hbase hbck -fix

Hbase管理命令

Flush

把内存中的数据写入硬盘

Compact

Region