Hbase预分区、rowKey设计及协处理器

一、HBase预分区操作

HBase默认建表时有一个region,这个region的rowkey是没有边界的,即没有startkey和endkey,在数据写入时,所有数据都会写入这个默认的region,随着数据量的不断增加,此region已经不能承受不断增长的数据量,会进行split,分成2个region。在此过程中,会产生两个问题:
1.数据往一个region上写,会有写热点问题。
2.region split会消耗宝贵的集群I/O资源。
HBase提供了预分区功能,用户可以在创建表的时候对表按照一定的规则分区。
预分区可以实现负载均衡,防止数据倾斜的问题发生。此外预分区也可以方便集群容灾调度region
可是我们应该创建多少个Region呢?显然没有具体答案,要结合业务,根据表的rowkey进行设计。
每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护

hbase(main):001:0> create 'staff','info' ,SPLITS => ['1000','2000','3000','4000']

根据startRowKey和endRowKey进行划分 一共5个分区
在这里插入图片描述
在这里插入图片描述
16进制算法预分区
HexStringSplit算法根据传入参数(最小值、最大值、分区数量)生成startKey,endKey为16进制表示的region。默认最小最大keySpace表示如下:

final static String DEFAULT_MIN_HEX = "00000000";
final static String DEFAULT_MAX_HEX = "FFFFFFFF";
hbase(main):003:0> create 'staff2','info' ,{
   NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

在这里插入图片描述
在这里插入图片描述
当分区数量太多时<根据文件内容预分区>

hbase(main):004:0> create 'staff3','partition2',SPLITS_FILE => '/export/servers/splits.txt'

文件:
aaaa
bbbb
cccc
dddd
在这里插入图片描述
Java API 生成预分区

//自定义算法,产生一系列 hash 散列值存储在二维数组中
byte[][] splitKeys = 某个散列值函数
//创建 HbaseAdmin 实例
HBaseAdmin hAdmin = new HBaseAdmin(HbaseConfiguration.create());
//创建 HTableDescriptor 实例
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
//通过 HTableDescriptor 实例和散列值二维数组创建带有预分区的 Hbase 表
hAdmin.createTable(tableDesc, splitKeys)

二、HBase RowKey设计

HBase查询只能通过其Rowkey来查询(Rowkey用来表示唯一一行记录),Rowkey设计的优劣直接影响读写性能
由于HBase是通过Rowkey查询的,一般Rowkey上都会存一些比较关键的检索信息,我们需要提前想好数据具体需要如何查询,根据查询方式进行数据存储格式的设计,要避免做全表扫描,因为效率特别低
在进行put数据的时候 rowkey会根据提前设计好的分区边界值(startrowKey,endrowKey) 进行插入,Hbase的rowKey是按照字典序进行逐位比较,看是处于哪个分区,那么数据就会存入到那个分区的范围内
1.rowkey长度原则
rowkey是一个二进制码流,可以是任意字符串最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存,一般设计成
定长
数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
目前操作系统是都是64位系统,内存8字节对齐。控制在16个字节,8 字节的整数倍利用操作系统的最佳特性。

2.rowkey散列原则
如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率如果没有散列字段,首字段直

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值