对表进行预分区,可以防止单分区一次写入数据过大,hbase 集群本身还没来得及自动分裂,导致 region 宕掉的问题。
1、创建表时指定一个拆分点数组
split point 将定义n+1个区域,其中n是分割点的数量, point 为'10'时实际上是在指定字节分割'\x31\30'
hbase>create 't1','f',SPLITS => ['10','20','30']
获取rowkey的第一个字节,按照进行分割
hbase> create 't',{NAME => 'f0',VERSIONS => 1, COMPRESSION => 'snappy'},{NAME => 'f1',VERSIONS => 10000, COMPRESSION => 'snappy'},CONFIGURATION => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicy','KeyPrefixRegionSplitPolicy.prefix_length' => '1'},SPLITS => ['2', '4', '6', '8']
2、使用 SPLITS_FILE 来指定一个文本文件,文件内写入拆分点。文件中的每一行都指定一个 split point key
hbase>create 't1','f',SPLITS_FILE=>'splits.txt'
3、根据所需的区域数量和分割算法自动计算分割。HBase 提供了基于均匀分割或基于十六进制键来分割键范围的算法,也可以提供自己的分割算法来细分键范围
# 基于随机算法创建一个有4默认个分区的表 hbase>create 't','f', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' } # 基于 hex keys 创建一个有4个默认分区的表 hbase>create 't','f', { NUMREGIONS => 4, SPLITALGO => 'HexStringSplit' }
说明:
NUMREGIONS:hbase 默认 HFile 的大小为 10G(hbase.hregion.max.filesize=10737418240=10G
)
HexStringSplit【占用空间大,rowkey是十六进制的字符串作为前缀的】:Row是十六进制编码的长值,其范围为“00000000”=>“FFFFFFFF”,格式是MD5校验和或任何其他均匀分布的十六进制值的ASCII表示形式。
UniformSplit【占用空间小,rowkey前缀完全随机】:rowkey前缀完全随机,键的空间平均分割,当rowkey是近似一致的随机字节时(例如散列),建议使用这个。
DecimalStringSplit:rowkey是10进制数字字符串作为前缀的。
4、使用put给hbase表里的数据插入数据
put 't_gather_20231212','6322416212','engoff:beginUtc','1702311104',timestamp=1702311104324
注意,版本是根据timestamp来控制的,为13位的时间戳值