HBase Region 拆分与合并

HBase Region 拆分与合并

Region 拆分

Region 自动拆分

HBase Region 的自动拆分有 6 种触发策略,如下:

  • ConstantSizeRegionSplitPolicy :按照固定大小来拆分 Region 策略

  • IncreasingToUpperBoundRegionSplitPolicy(默认):限制不断增长的文件尺寸的策略

  • SteppingSplitPolicy

  • DisabledRegionSplitPolicy:永不自动拆分策略

  • KeyPrefixRegionSplitPolicy

  • DelimitedKeyPrefixRegionSplitPolicy

RegionSplitPolicy 自动拆分策略的使用
  • 通过 hbase-site.xml 全局统一配置,如下:
 <property>
    <name>hbase.regionserver.region.split.policy</name>
    <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value>
  </property>
  • 通过 Java API 为单独的表指定 Region 拆分策略

    HTableDescriptor tableDesc = new HTableDescriptor("test1");
    //指定表 Region 自动拆分策略
    tableDesc.setValue(HTableDescriptor.SPLIT_POLICY, IncreasingToUpperBoundRegionSplitPolicy.class.getName());
    tableDesc.addFamily(new HColumnDescriptor(Bytes.toBytes("cf1")));
    admin.createTable(tableDesc);
    ...
    
  • 通过 HBase Shell 为单个表指定 Region 拆分策略

    hbase(main):001:0> create 'test1', {METADATA => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy'}},{NAME => 'cf1'}
    

手动拆分

Region 的预拆分(pre-splitting)

预拆分(pre-splitting)就是在建表的时候就定义好了拆分点的算法,所以叫预拆分。

手动指定拆分点:在建表的时候跟上 SPLITS 参数

hbase(main):029:0> create 'split01','cf1',SPLITS=>['1000000','2000000','3000000'] 

Region 强制拆分(forcedsplits)

除了预拆分和自动拆分以外,你还可以对运行了一段时间的 Region 进行强制地手动拆分(forcedsplits)。方法是调用 hbase shell 的 split方法。

[root@node-01 ~]# hbase shell $> split'test_table1,c,1476406588669.96dd8c68396fda69.','c_110'

这个就是把 test_table1,c,1476406588669.96dd8c68396fda69 这个 Region 从新的拆分点 c_110 处拆成 2 个Region。

推荐方案:

  • 用预拆分导入初始数据

  • 然后用自动拆分来让 HBase 来自动管理 Region

    建议:不要关闭自动拆分

Region 合并

Region 可以被拆分,也可以被合并。不过 Region 的合并(merge)并不是为了性能考虑的,而更多地是出于维护的目的被创造出来的。

何时合并

比如删了大量的数据,每个Region都变小了,这个时候分成这么多个Region就有点浪费了,可以把Region合并起来,然后可以减少一些RegionServer服务器来节省成本。

如何合并
  • 通过 Merge 类合并 Region

  • 在线合并(online_merage)

RegionServer 运行多少个 Region 比较合理

RegionServer的堆内存大小0.4(hbase.regionserver.global.memstore.size)/128M(hbase.hregion.memstore.flush.size)列族的数量'

HBase 的列族不宜过多
posted @ 2022-01-28 20:28  追こするれい的人  阅读(344)  评论(0编辑  收藏  举报