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预分区介绍完毕。


亲,看完了点个赞呗!!

赫墨拉

我是一个喜爱大数据的小菜鸡,这里是我分享我的成长和经历的博客

You may also like...

8 Responses

  1. Master说道:

    预分区之后根据环境情况,还可以禁止各个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=>[” , ” , ”]

  2. 匿名说道:

    从0-9预分区什么样的数据会存到第一个region中呢

  3. 匿名说道:

    hbase预分区为2的幂次方数。一般rowkey在进行散列化时为十六进制数,所以推荐使用16的整数倍进行分区。这样可以有效避免热点分区

发表评论

邮箱地址不会被公开。