1. HBase的预分区概念

HBase表被创建时,只有1个Region,当一个Region过大达到默认的阀值时(默认10GB大小),HBase中该Region将会进行split,分裂为2个Region,以此类推。

表在进行split的时候,会耗费大量的资源,频繁的分区对HBase的性能有巨大的影响。

所以,HBase提供了预分区功能,即用户可以在创建表的时候对表按照一定的规则分区。
预分区是默认分区基础上,再分多少个区,所以最终的分区数是默认的1个+预分区的个数

2. HBase预分区的作用

避免HBase经常split,产生不必要的资源消耗,提高HBase的性能。

3. HBase预分区的方法

  • HBase Shell
  • HBase Shell(通过读取split文件)
  • HBase Java API

4. HBase预分区案例

4.1 需求

有一个用户数据文件,内容如下(如下数据纯属假数据,如有雷同纯属巧合)

hbase region分布策略 hbase的分区_HBase Shell预分区

4.2 分析数据

  1. 将第一列数据作为Row-key, 该列为用户手机号倒转(为了避免Region热点问题),关于HBase的rowkey设计原则,请持续关注博客文章更新。
  2. 其他列用户信息,设置列簇:Info, 还有其他额外用户描述信息,设置列簇:Desc

5. 实例

为了好识别不同方法实例,每个实例分区数都不同

5.1 HBase Shell

在HBase Shell中:执行如下命令,创建表user1. 添加额外splits=>参数

create 'user1',{NAME=>'info'},{NAME=>'desc'},SPLITS=>['0','1','3','4','5','6','7','8','9']
  • HBase执行情况如下;

hbase region分布策略 hbase的分区_HBase预分区_02

  • 执行完命令,在HBase WEB UI上查看user1表的相关信息,发现user1表被分为11个Region。

hbase region分布策略 hbase的分区_HBase预分区_03

  • 查看该表Region详细信息:

hbase region分布策略 hbase的分区_hbase region分布策略_04

5.2 HBase Shell(通过读取split文件)

  • split文件内容如下

hbase region分布策略 hbase的分区_HBase Shell预分区_05

  • HBase Shell中: 执行如下命令,创建表user2,添加额外参数SPLITS_FILE=>并指定split文件绝对路径
create 'user2',{NAME=>'info'},{NAME=>'desc'},SPLITS_FILE=>'/data/yw/hbaseSplit.txt'
  • HBase执行情况

hbase region分布策略 hbase的分区_HBase Shell预分区_06

  • 执行命令后,在HBase WEB UI上查看user2表的相关信息,发现user2表被分成5个Region

hbase region分布策略 hbase的分区_HBase预分区_07

  • 查看该表Region详细信息

hbase region分布策略 hbase的分区_HBase Shell预分区_08

5.3 HBase API

  • 使用Scala编写一个Demo, 实现HBase的Java API
object HbaseUtil { def main(args: Array[String]): Unit = { 
   val conf = HBaseConfiguration.create() conf.set("hbase.zookeeper.quorum","192.168.1.22,192.168.1.50,192.168.1.51")
    conf.set("hbase.zookeeper.property.clientPort", "2181")
    conf.set("zookeeper.znode.parent", "/hbase-unsecure")
    conf.set("hbase.master", "192.168.1.22:16010") 
    val connection = ConnectionFactory.createConnection(conf) 
    val admin = connection.getAdmin 
    val colFamily = List("info", "desc")
    val tableName = "user3"  
    val splitKeys = Array(
      Bytes.toBytes("00"),
      Bytes.toBytes("11"),
      Bytes.toBytes("22"),
      Bytes.toBytes("33"),
      Bytes.toBytes("44")
    ) if (admin.tableExists(TableName.valueOf(tableName))) { println("表已存在!")
    } else { val descriptor = new HTableDescriptor(TableName.valueOf(tableName))
      colFamily.foreach(x => descriptor.addFamily(new HColumnDescriptor(x)))
      admin.createTable(descriptor, splitKeys)
    }
    admin.close()
    connection.close()
  }
}
  • 执行测试代码后,在HBase WEB UI上查看user3表相关信息,发现user3表被分成6个Region

hbase region分布策略 hbase的分区_HBase Java API预分区_09

  • 查看该表Region详细信息,与我们代码中所设置得到Splits相同

hbase region分布策略 hbase的分区_HBase预分区_10



如果喜欢本文章,请用小手点个赞~