一、Hbase架构

为什么hbase的hmaster起不来 hbase master region_数据

  • Client:
  • 包含访问HBase的接口并维护cache来加快对HBase的访问
  • 与HRegionServer进行数据读写操作
  • Zookeeper:
  • 用于存储Hbase集群的元数据信息(HBase的schema和table元数据)
  • 存储所有Region的寻址入口
  • 负责Master的HA机制,保障Master正常运行
  • 监控RegionServer的健康监控,并通知Master
  • Master:
  • 为RegionServer分配Region
  • 负责维护RegionServer的负载均衡
  • 发现失效RegionServer并中心分配其上的Region
  • 管理用户对table的增删改查操作
  • RegionServer:
  • 负责维护Region的数据,处理Region的IO请求
  • 监控Region的大小,负责其Split过程
  • Region:
  • Region是HBase中分布式存储和负载均衡的最小单元
  • 逻辑概念是一个Region对应Hbase中的一张表,当表中的数据大到一个阈值之后,Region会被等分为两个新的Region,并且由Master为其分配到对应空闲的RegionServer上
  • 当table的行不断增多的,就会有越来越多的Region,这样一张完整的表会被保存在多个RegionServer上,达到负载均衡的作用
  • Store:
  • 逻辑概念上一个Store对应一个表中的一个列族
  • 一个表有多少个列族一个Region中就有多少个Store
  • MemStore:
  • 往Region写入数据,会先被写入内存中,这块内存就是MemStore
  • 定期将MemStore中的数据写入磁盘
  • StoreFile:
  • MemStore将数据写入磁盘,就形成了StoreFile
  • StoreFile在HDFS的存储格式就是HFile
  • HLog:
  • 预写日志,记录HRegionServer的处理过程,一旦RegionServer宕机后,可以从HLog进行恢复数据,用于容灾
  • 用于记录数据的变更操作

二、Hbase写流程

1、整体写流程

  • Client从Zookeeper中获取meta表所在的RegionServer地址(负责管理表的元数据信息)
  • Client访问meta表所在的RegionServer,获取到表格所在的RegionServer地址
  • Client与表格存储的RegionServer建立链接,先将数据操作记录写入HLog中,然后再将数据写入对应的Region(表格)下对应的Store(列族)中的内存数据结构,即:MemStore
  • MemStore达到一定阈值后会创建一个新的MemStore,旧的MemStore会被后台线程将数据刷写到磁盘上,形成StoreFile文件
  • 【可选】在MemStore刷写过程中,由于StoreFile是只读不可变的,当Store中的StoreFile达到一定阈值,就会进行一次合并(compactions)
  • minor compact:将Store下相邻的小StoreFile合并成一个大的StoreFile文件,目的是减少一个Store下存在过多StoreFile的情况
  • major compact:将Store下所有StoreFile(同一个列族下的所有文件)进行合并,期间还会对数据进行清理,例如:删除标识了delete的数据以及过期的数据等,且将对同一个key的修改合并到一起,形成一个大的StoreFile文件,假若合并后的StoreFile文件过大,还会对StoreFile进行分割
  • StoreFile定期会被同步到HDFS中,以二进制文件的格式HFile存储(数据持久化完成)
  • 标识该数据在HLog中是可清楚的状态

2、扩展点

2.1、关于数据的刷写操作:

  • HLog的刷写:HLog实则也是存在内存中,但是存在刷写存入HDFS操作,时间间隔为1s
  • MemStore的刷写:
  • MemStore大小达到一定阈值或者达到一定时间内就会将数据刷写到磁盘上,即StoreFile文件
  • StoreFile会以二进制文件HFile的格式,定时被存入HDFS中,完成持久化

2.2、为什么会出现compactions:

  • 假设一张table下的有128个1M的StoreFile文件,我们在全量查询这张表的时候,需要去检索HDFS下这128个小文件。对于HDFS来说检索一个128M的文件的效率远比检索128个1M的文件快的多,太多的小文件对于HDFS的NameNode来说也会造成一定的影响
  • 加快HBase查询的效率,减少小文件对HDFS的影响

2.3、minor compact与major compact的区别:

  • minor compact侧重于将多个小文件进行合并成大文件
  • major compact侧重于将同一个列族下的所有文件进行合并,过程中还是清除掉一些没用的数据

三、HBase读流程

1、整体读流程

  • Client从Zookeeper中获取meta表所在的RegionServer地址(负责管理表的元数据信息)
  • Client访问meta表所在的RegionServer,获取到表格所在的RegionServer地址
  • Client访问具体的Region所在的RegionServer,找到对应的Region及Store
  • 从MemStore中读取数据,如果读取到了那么直接将数据返回,如果没有,则去BlockCache读取数据
  • 从BlockCache中读取到数据,则直接返回数据给客户端,如果读取不到,则遍历storefile文件查找数据
  • 从storefile中读取不到数据,则返回客户端为空,如果读取到数据,那么需要将数据先缓存到BlockCache中(方便下一次读取),然后再将数据返回给客户端
  • BlockCache是内存空间,如果缓存的数据比较多,满了之后会采用LRU策略,将比较老的数据进行删除

2、扩展点

2.1、什么是BlockCache:

  • BlockCache作为HBase的读缓存,保存着HBase中最近被访问的数据块。但是从上面的架构图中我们没有看到BlockCache这个角色的存在,那是因为BlockCache是包含在RegionServer中的,即一个RegionServer就存在一个BlockCache
  • 对于离线计算大量Scan读取HBase中的数据的时候,建议将BlockCache关闭,在离线场景中BlockCache缓存意义不大,反而会占用RegionServer内存,影响性能