美文网首页hbase
HexStringSplit预分区表

HexStringSplit预分区表

作者: 仰望夜空一万次 | 来源:发表于2019-08-02 23:08 被阅读0次

导读:本文介绍如何使用hbase自带的HexStringSplit算法,根据传入参数(最小值、最大值、分区数量)生成startKey,endKey为16进制表示的region。

RegionSplitter.HexStringSplit()自带的默认最小最大keySpace表示如下:

final static String DEFAULT_MIN_HEX = "00000000";
final static String DEFAULT_MAX_HEX = "FFFFFFFF";

但我们需要根据记录中的数值范围进行定制keySpace值的上下限,避免创建出rowkey无法访问的region。

/**
 *  生成用于创建分区表的rowKey字节数组,数组中每个值都是十六进制字符表
 *
 *  @param regionNum  期望的分区数量
 *  @param startIndex 当前系统的最小值(可忽略独立单条最小值,取接近众数的最小值)
 *  @param endIndex   为系统的最大值(可忽略独立单条最大值,取接近众数的最大值)
 *  @return splits    用于创建分区表的rowKey数组
 * */
public byte[][] hexSplit(int regionNum, BigInteger startIndex, BigInteger endIndex) throws IOException {
    RegionSplitter.SplitAlgorithm algo = new RegionSplitter.HexStringSplit();
    algo.setFirstRow(startIndex.toString(16));
    algo.setLastRow(endIndex.toString(16));
    byte[][] splits = algo.split(regionNum);
    return splits;
}

/**
 * 使用16进制的字符表示key space中的startKey、endKey,对数值区间进行均匀划分
 * */
public void createTableByHexStringSplit() throws IOException {
    Connection connection = getConnection();
    Admin admin = connection.getAdmin();
    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(namespaceAsString + ":" + tableName));
    desc.addFamily(new HColumnDescriptor(familyName));
    //startIndex为业务中的最小index
    BigInteger startIndex=BigInteger.valueOf(0L);
    //endIndex为业务中的最大index
    BigInteger endIndex=BigInteger.valueOf(2147483647);
    //分区的数量
    int regionNum=16;
    byte[][] splits = hexSplit(regionNum,startIndex,endIndex);
    admin.createTable(desc, splits);
}

region分布以8位的16进制进行key space表示:

image.png

key会根据endIndex的16进制字符长度对较短字符使用“0”进行补充。例如:第一个region的end key为“08000000”,第一个字符“0”为填充,让整个key满足8位。

如果觉得21亿多(2147483647)的数值仍然不能满足rowkey的表示,可以使用long类型的endIndex来表示,以生成更多位数的十六进制表示。

//startIndex为业务中的最小index
BigInteger startIndex=BigInteger.valueOf(0L);
//endIndex为业务中的最大index,假设为Long.MAX_VALUE,
//long MAX_VALUE = 0x7fffffffffffffffL;
BigInteger endIndex=BigInteger.valueOf(9223372036854775807L);
//分区的数量
int regionNum=16;

region分布以16位的16进制进行key space表示:

image.png

如何生成rowkey或rowkey前缀?
** **将要插入的index(作为rowkey或rowkey前缀)生成16进制表示的字符串。

//long类型
BigInteger rowkeyPrefix = BigInteger.valueOf(9223372036854775807L);
//or int类型
BigInteger rowkeyPrefix = BigInteger.valueOf(2147483647);

总结:

  • 如果做为rowkey前缀的id本身具有自增特性且连续,可以对id直接进行区间划分,但要考虑id自增的速度,是提前预留分区还是后期手动split region。
  • 此key space分区不适用于反转index的方式。例如,反转21474为47421。

相关文章

  • HexStringSplit预分区表

    导读:本文介绍如何使用hbase自带的HexStringSplit算法,根据传入参数(最小值、最大值、分区数量)生...

  • MBR分区与GPT分区

    Linux系统中有两种常见的分区表 MBR分区表(主引导记录分区表)和 GPT分区表(GUID分区表) MBR分区...

  • Vertica的这些事(九)—— vertica存储统计信息

    vertica存储统计信息: 表数量: 分区表数量: 总表占大小: 分区表总大小: 分区表大小(前10): 分区表...

  • MySQL-31.分区表

    分区表有什么问题,为什么公司规范不让使用分区表呢? 1.分区表是什么? 为了说明分区表的组织形式,先创建一个表 t...

  • Impala分区表

    摘要:Impala,分区表,hdfs 分区表 分区表就是将某个分区的数据的单独存放,当使用where语句是针对某个...

  • 如何将硬盘分区表转换为GUID(GPT)分区表

    如何将硬盘分区表转换为GUID(GPT)分区表 如果不知道自己的硬盘分区表类型可以参看 Windows--如何查看...

  • PostgreSQL实现数据表分区

    1.建表 2.创建子表(分区表) 根据主表的创建日期月份来建立分区 3.给分区表创建主键 继承主表的分区表无法继承...

  • 高水位线处理

    1. 查询高水位情况 查询块大小 查询10G水位线上的对象 2. 清理分区表 移动分区表 删除分区表 3. 移动表...

  • Linux安装-分区和格式化

    1.两种分区表形式(针对一块硬盘) MBR分区表(主引导记录分区表):最大支持2.1TB硬盘,最多支持4个分区 G...

  • Hive创建分区表,动态插入数据

    1、创建分区表

网友评论

    本文标题:HexStringSplit预分区表

    本文链接:https://www.haomeiwen.com/subject/kccddctx.html