一、Region 概念
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)
Region 大小
Region的大小是一个棘手的问题,需要考量如下几个因素。
- Region是HBase中分布式存储和负载均衡的最小单元。不同Region分布到不同RegionServer上,但并不是存储的最小单元。
- Region由一个或者多个Store组成,每个store保存一个columns family,每个Strore又由一个memStore和0至多个StoreFile 组成。memStore存储在内存中, StoreFile存储在HDFS上。
- HBase通过将region切分在许多机器上实现分布式。
- region数目太多就会造成性能下降,对于同样大小的数据,700个region比3000个要好。
- region数目太少就会妨碍可扩展性,降低并行能力。有的时候导致压力不够分散。
- RegionServer中1个region和10个region索引需要的内存量没有太多的差别。
最好是使用默认的配置,可以把热的表配小一点(或者受到split热点的region把压力分散到集群中)。如果你的cell的大小比较大(100KB或更大),就可以把region的大小调到1GB。region的最大大小在hbase配置文件中定义:
<property> <name>hbase.hregion.max.filesize</name> <value>20 * 1024 * 1024 * 1024</value> </property>
说明:
当region中的StoreFile大小超过了上面配置的值的时候,该region就会被拆分,具体的拆分策略见下文。
上面的值也可以针对每个表单独设置,例如在hbase shell中设置:
create 't','f' disable 't' alter 't', METHOD => 'table_att', MAX_FILESIZE => '134217728' enable 't'
二、自动分区
一张表初始时只有一个region,用户开始向表中插入数据时,系统检查这个region的大小,确保其不超过配置的最大值,如果超过了限制,系统会在中间键(region 中间的那个行键)处将这个region拆分成两个大致相等的子region
三、分裂详细过程
Region自动切分是HBase能够拥有良好扩张性的最重要因素之一。HBase系统中Region自动切分是如何实现的?这里面涉及很多知识点,
比如:
(1)Region切分的触发条件是什么?
(2)Region切分的切分点在哪里?
(3)如何做好切分过程中的异常处理?
(4)切分过程中要不要将数据移动?