HBase预分区、HBase Shell预分区、HBase Shell读取split文件预分区、HBase Java API预分区 09

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 分析数据

  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 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相同
    在这里插入图片描述
    如果喜欢本文章,请用小手点个赞~
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值