首先,我们来看一张 HBase 的存储结构图(图片来源于网络),如下:
HBase 的数据存储节点叫做 HRegionServer,每个 HRegionServer 管理很多个 HRegion,Region 是HBase你们数据管理的最小单元,不同的 Region 存放在不同的 HRegionServer 机器上。
每个 HRegion 由一个 HLog 和 一个或者多个 Store 组成。每个 Store 由保存一个列簇 (columns family) 。 每个Strore又由一个memStore和 零个至多个StoreFile 组成。memStore 存储在内存中, StoreFile 存储在HDFS上。
说到这里,我们可以很明显的感知到,多个 Region 会造成性能问题,具体是什么性能问题,接着往下看……但我们在想一个问题,Region 少一点绕开性能问题行不行。笔者直接告诉你,也不行!为什么? Region 数目太少就会妨碍可扩展性,导致单个 Region 变得很大降低了并行度。
回到正题,我们在定义 HBase 表的时候,在没有配置“hbase.hregion.max.filesize”的情况下,默认单个 Region 的大小为:10 * 1024 * 1024 * 1024,但写入数据量超过该值,会造成 Region 的 split 动作。这个 RegionSplitPolicy 策略有如下几种方式:
ConstantSizeRegionSplitPolicy : 这个是版本为 0.94.0 的默认region split 策略。根据公式min(r^2*flushSize&