Region是表的可用性和分布性的基本元素,每个列族包含在一个Store中,下面是这个主题的层次结构:
Table
(HBase table)Region
(Regions for the table)Store
(Store per ColumnFamily for each Region for the table)MemStore
(MemStore for each Store for each Region for the table)StoreFile
(StoreFiles for each Store for each Region for the table)Block
(Blocks within a StoreFile within a Store for each Region for the table)
为了描述HBase文件存入HDFS时的样子,可参看Section 13.7.2, “Browsing HDFS for HBase Objects”。
总体来讲,HBase是为每个服务器上承载相对较少的region的使用场景设计的。5-20Gb vs. 20-200
通常,很多原因使你想把region数降低。一般每个服务器承载100个左右的region是最好的,以下是一些希望保持region较少的原因:
这个部分将描述region是如何分配到regionserver上的。
当HBase开启region是会按如下步骤进行分配:
当RegionServer发生故障时:
Region会周期性地被LoadBalancer移动。
随着时间的推移,Region-RegionServer的本地性会通过HDFS的块副本而达到。HDFS默认通过以下步骤选择写副本的位置:
更多信息,可以参考HDFS Architecture和HBase and HDFS locality。
当region大小达到配置的阀值时region就会分裂。下面将长话短说,详细信息可以参考 Apache HBase Region Splitting and Merging。
分裂是独立进行的,Master并不参与。RegionServer分裂一个region,会是原region下线,之后将region的两个子女region写入META,再在承载原region的RegionServer上开启子女region,并将分裂信息报告给Master。
默认的分裂策略可通过RegionSplitPolicy(HBase 0.94+)重写,通常自定义的分裂策略会继承于默认的分裂策略ConstantSizeRegionSplitPolicy。
可以通过HBaseConfiguration设置全局的分裂策略,或针对某个表设置:
HTableDescriptor myHtd = ...; myHtd.setValue(HTableDescriptor.SPLIT_POLICY, MyCustomSplitPolicy.class.getName());
Master和RegionServer都会参与在线region合并。客户端会向Master发送合并RPC,之后Master会将region移动到承载region较多的那个RegionServer,最后会发送合并指令给每个region服务器,并合并region。与region分裂的过程相似,region也是运行在RegionServer本地的,先将region下线,之后合并文件系统上的两个region,自动从META删除掉合并的region,再将合并后的region添加到META中,再开启这个region,最后将合并信息发送给Master。
使用HBase shell进行region合并的例子如下:
$ hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME' hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME', true
这是一个异步操作。
一个存储包含了一个内存存储和若干个文件存储,一个存储可以定位到一个列族的一个region。
MemStores是Store中的内存Store,可以进行修改操作。修改的内容是KeyValues。当请求flush时,现有的memstore会生成快照,然后清空。在执行快照的时候,HBase会继续接收修改操作,保存在memstore外面,直到快照完成。
StoreFiles是数据存储的地方。
hfile文件格式是基于BigTable [2006]论文中的SSTable。构建在Hadoop的tfile上面(直接使用了tfile的单元测试和压缩工具)。 Schubert Zhang 的博客HFile: A Block-Indexed File Format to Store Sorted Key-Value Pairs详细介绍了HBases的hfile。Matteo Bertozzi也做了详细的介绍HBase I/O: HFile。
要想看到hfile内容的文本化版本,你可以使用org.apache.hadoop.hbase.io.hfile.HFile
工具。可以这样用:
$ ${HBASE_HOME}/bin/hbase org.apache.hadoop.hbase.io.hfile.HFile
例如,你想看文件hdfs://10.81.47.41:9000/hbase/TEST/1418428042/DSMP/4759508618286845475
的内容, 就执行如下的命令:
$ ${HBASE_HOME}/bin/hbase org.apache.hadoop.hbase.io.hfile.HFile -v -f hdfs://10.81.47.41:9000/hbase/TEST/1418428042/DSMP/4759508618286845475
如果你没有输入-v,就仅仅能看到一个hfile的汇总信息。其他功能的用法可以看HFile
的文档。
参考Section 13.7.2, “Browsing HDFS for HBase Objects”。
StoreFiles是由块组成的,块大小以列族为单元进行配置。压缩是在StoreFiles中块级别上发生的。
KeyValue类是HBase存储的核心。KeyValue包装着一个字节数组、位移、被译为KeyValue的内容已经过的数组的长度。
字节数组内KeyValue的格式为:
为了强调上述观点,检验Puts同一行的两个不同的列时发生什么,举例如下:
rowkey=row1, cf:attr1=value1
#2: rowkey=row1, cf:attr2=value2
#1的键的组成 :
------------> 4
-----------------> row1
---> 2
--------> cf
------> attr1
-----------> server time of Put
-------------> Put
------------> 4
-----------------> row1
---> 2
--------> cf
------> attr1
-----------> server time of Put
-------------> Put
有两种类型的紧缩:次紧缩和主紧缩。minor紧缩通常会将数个小的相邻的文件合并成一个大的。Minor不会删除打上删除标记的数据,也不会删除过期的数据,Major紧缩会删除过期的数据。有些时候minor紧缩就会将一个store中的全部文件紧缩,实际上这个时候他本身就是一个major压‹缩。对于一个minor紧缩是如何紧缩的,可以参见ascii diagram in the Store source code.
在执行一个major紧缩之后,一个store只会有一个sotrefile,通常情况下这样可以提供性能。注意:major紧缩将会将store中的数据全部重写,在一个负载很大的系统中,这个操作是很伤的。所以在大型系统中,通常会自己Section 2.8.2.8, “管理 Splitting”。
紧缩 不会 进行分区合并。参考 Section 14.2.2, “Merge” 获取更多合并的信息。
想了解StoreFiles选择算法需要了解一些ASCII的结构知识,示例如下:
/* normal skew: * * older ----> newer * _ * | | _ * | | | | _ * --|-|- |-|- |-|---_-------_------- minCompactSize * | | | | | | | | _ | | * | | | | | | | | | | | | * | | | | | | | | | | | | */
要点:
hbase.store.compaction.ratio
选择算法中使用的紧缩文件命中率(default 1.2f).hbase.hstore.compaction.min
(.90 hbase.hstore.compactionThreshold) (files) 发生紧缩时Store中的最小文件数(default 2).hbase.hstore.compaction.max
(files) 每次次紧缩包含的最大文件数 (default 10).hbase.hstore.compaction.min.size
(bytes) 任意大小小于这个值StoreFile会自动成为紧缩的候选文件,默认是hbase.hregion.memstore.flush.size
(128 mb).hbase.hstore.compaction.max.size
(.92) (bytes) 任意大小大于该值的StoreFile都不做紧缩操作 (default Long.MAX_VALUE).hbase.hstore.compaction.ratio
的。
http://hbase.apache.org/book/regions.arch.html