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 需求
有一个用户数据文件,内容如下(如下数据纯属假数据,如有雷同纯属巧合)
4.2 分析数据
- 将第一列数据作为Row-key, 该列为用户手机号倒转(为了避免Region热点问题),关于HBase的rowkey设计原则,请持续关注博客文章更新。
- 其他列用户信息,设置列簇: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 WEB UI上查看user1表的相关信息,发现user1表被分为11个Region。
- 查看该表Region详细信息:
5.2 HBase Shell(通过读取split文件)
- split文件内容如下
- HBase Shell中: 执行如下命令,创建表user2,添加额外参数SPLITS_FILE=>并指定split文件绝对路径
create 'user2',{NAME=>'info'},{NAME=>'desc'},SPLITS_FILE=>'/data/yw/hbaseSplit.txt'
- HBase执行情况
- 执行命令后,在HBase WEB UI上查看user2表的相关信息,发现user2表被分成5个Region
- 查看该表Region详细信息
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
- 查看该表Region详细信息,与我们代码中所设置得到Splits相同
如果喜欢本文章,请用小手点个赞~