HBase进阶学习(四)--相关原理和调优方式

存储原理

HBase构架

如上图所示,一个HBase集群是由Zookeeper、HMaster和HRegionServer构成的

HRegionServer

HBase集群上的各个节点,一个数据量很大的表可能被保存在不同RegionServer上

HLog

HBase将数据存储在各个HRegionServer上,每个HRegionServer**都有一个HLog文件记录该节点上数据的CRUD操作记录**
图中错误的地方在于HLog是和HRegionServer一个级别的,而不是里面的HRegion
HLog是Hadoop上的sequence file文件,key为HLogKey对象,记录了hbase读写操作的日志,value是hbase的key-value对象

HRegion

按照Rowkey横向切分的多个块,保存着表中某段连续的数据
当某个RegionServer上的HRegion过大时会进行水平切分
如果HRegion数过多,HBase会选择一个比较空闲的RegionServer来保存一部分的HRegion
这样一来一个表的数据就被保存在不同RegionServer上的不同HRegion中

Store

HRegion中包含多个Store,每个Store对应HBase表中的一个列族,有几个列族就有几个Store
Store分为两种:

1.MemStore
2.StoreFile

向表中写数据的时候先写入内存的MemStore中,MemStore达到一个阈值的时候会产生溢写,写数据到磁盘中形成StoreFile
读表数据时也是先查MemStore中有没有该数据,没有才去找StoreFile

HFile

HBase数据最后存储在HDFS上的形式,HFile中保存的是真正的数据,之前提到的Store文件中存储的其实是HFile的元数据信息,包含了HFile到HDFS的映射关系
每个StoreFile都对应一个HFile文件
找到了Store文件就可以在HDFS上找到HFile

调优方式

只有理解了HBase的存储原理才能通过其对HBase进行相关的调优设置

合并

之前说过,Store中的MemStore会溢写产生StoreFile
当MemStore溢写次数过多的时候会产生多个StoreFile,导致HDFS上有大量HFile小文件,所以当StoreFile数量大小达到一个阈值的时候HBase会对其进行合并(Compaction)

Compaction分为两种:

1.major compaction
2.mirror compaction

major默认24小时执行一次,会将全部的StoreFile合并起来,消耗大量的io,最好手动写程序控制执行的时间,放在闲时处理

mirror可以通过配置文件设定当StoreFile文件大小、数量达到设定的值的时候,对指定的多少个StoreFile文件进行合并
相关配置项如下:

  • hbase.hstore.compaction.min :默认值为 3,表示至少需要三个满足条件的StoreFile时,minor compaction才会启动
  • hbase.hstore.compaction.max :默认值为10,表示一次minor compaction中最多选取10个StoreFile
  • hbase.hstore.compaction.min.size :表示文件大小小于该值的StoreFile 一定会加入到minor compaction的StoreFile中
  • hbase.hstore.compaction.max.size :表示文件大小大于该值的StoreFile 一定会被minor compaction排除
  • hbase.hstore.compaction.ratio :将StoreFile 按照文件年龄排序(older to younger),minor compaction总是从older StoreFile开始选择,如果该文件的size 小于它后面hbase.hstore.compaction.max 个StoreFile size 之和乘以 该ratio,则该StoreFile 也将加入到minor compaction 中。

预分区

HBase建表时默认只在一个HRegionServer上建一个HRegion,写数据全部往该HRegion写
当这个HRegion达到一定大小的时候进行水平切割为多个HRegion,自动进行负载均衡

在这个环节,我们可以通过预先创建一个空的HRegion,并规定好每个HRegion存储的Rowkey范围
这样一来,指定范围内的数据就会被写入到指定的HRegion中,可以省略很多IO操作

通过对数据的特性进行分析预先创建分区可以有效的解决HBase中的数据倾斜问题

以存储日志访问的记录为例
根据数据量和每个HRegion的大小,预先创建空的HRegion,每个HRegion都设定了其RowKey的范围,插入数据时直接写入指定的HRegion中
或者根据数据的访问特性(28原则,进行抽样调查,得到数据频繁的情况),将经常访问的ip断分割为几个HRegion,其他为一个或者几个HRegion
根据具体需求确定预分区是预估还是抽样,预分区的时候尽可能的想到各种各样的情况

Rowkey

HBase设计的要点在Rowkey上
例如定长10-100字节等,Rowkey的设计实例可以参考:Oracle数据迁移至HBase操作记录
另外,可以利用Rowkey字典排序的特性,例如,最近写入的数据最常被访问,那么Rowkey可以为Long.MAX_VALUE-timestamp作为Rowkey,最近的数据会排在最前面加快访问速度

作者:@小黑

你可能感兴趣的:(hbase)