HBase的预分区
HBase预分区
概念:
HBase表被创建时,只有1个Region,当一个Region过大达到默认的阈值时(默认10GB大小),HBase中该Region将会进行split,分裂为2个Region,以此类推。
表在进行split的时候,会耗费大量的资源,频繁的分区对HBase的性能有巨大的影响。
所以,HBase提供了预分区功能,即用户可以在创建表的时候对表按照一定的规则分区。
作用:
避免HBase经常split,产生不必要的资源消耗,提高HBase的性能。
预分区的方法:
1.HBase Shell
2.HBase Shell(通过读取split文件)
3.HBase Java API
案例:
这里有一个用户数据文件,内容如下:
注:图片所示数据均为假数据,如有雷同,纯属巧合!
分析数据:
1.将第一列数据作为Row-key,该列为用户手机号倒转(为了避免Region热点问题),关于Row-Key设计,请关注后续博客文章更新。
2.其他列为用户信息,设置列族:Info,还有其他额外用户描述信息,设置列族:Desc
实例:
Tips:为了好识别,每个实例分区数不同
1.HBase Shell:
在HBase Shell中:执行如下命令,创建表user1,添加额外SPLITS=>参数
create ‘user1’,{NAME => ‘info’ },{NAME => ‘desc’},SPLITS => [‘0′,’1’, ‘2’, ‘3’, ‘4’,’5′,’6′,’7′,’8′,’9′]
hbase 执行情况:
hbase(main):001:0> create 'user1',{NAME => 'info' },{NAME => 'desc'},SPLITS => ['0','1', '2', '3', '4','5','6','7','8','9'] 0 row(s) in 2.5020 seconds => Hbase::Table - user1
执行命令后,在Hbase WEB UI上查看user1表的相关信息:
发现user1表被分为11个Region
查看该表Region详细信息:
2.HBase Shell(通过读取split文件)
split文件内容如下:
在HBase Shell中:执行如下命令,创建表user2,添加额外参数SPLITS_FILE =>并指定split文件绝对路径
create ‘user2’,{NAME => ‘info’ },{NAME => ‘desc’},SPLITS_FILE => ‘/data/yw/hbaseSplits.txt’
Hbase执行情况:
hbase(main):001:0> create 'user2',{NAME => 'info' },{NAME => 'desc'},SPLITS_FILE => '/data/yw/hbaseSplits.txt' 0 row(s) in 1.4880 seconds => Hbase::Table - user2
执行命令后,在Hbase WEB UI上查看user2表的相关信息:
发现user2表被分为5个Region
查看该表Region详细信息:
3.HBase API
VV这里使用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相同:
至此,Hbase预分区介绍完毕。
亲,看完了点个赞呗!!
预分区之后根据环境情况,还可以禁止各个Region进行自动split {METADATA=>{‘SPLIT_POLICY’=>’org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy’}}
完整实例:
create ‘tableName’ , {METADATA=>{‘SPLIT_POLICY’=>’org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy’}},{NAME=>’CF’ , COMPRESSION=>’SNAPPY’},SPLITS=>[” , ” , ”]
多谢大佬指点
指点说不上,我是来求知的
从0-9预分区什么样的数据会存到第一个region中呢
根据rowKey与预分区的start Key字典顺序进行分配Region,相同的范围存放到Region中
保存的rowkey以0开头的会存到第一个region
hbase预分区为2的幂次方数。一般rowkey在进行散列化时为十六进制数,所以推荐使用16的整数倍进行分区。这样可以有效避免热点分区
0123456789abcde分区