使用 Hbase Shell 命令创建预分区表(hbase预分区)

在通过 HBase Shell create 命令创建表时,可以使用多种选项来对表进行预分区。最简单的方法是在创建表时指定一个拆分点数组。

注意:当将字符串文本指定为拆分点时,这些拆分点将基于字符串的底层字节表示创建拆分点。

因此,当指定一个 split point 为'10'时,实际上是在指定字节分割'\x31\30'。 

split point 将定义n+1个区域,其中n是分割点的数量。最小的 region 将包含从可能的最小键到第一个拆分点键的所有键(不包括第一个key)。下一个 region 将包含从第一个拆分点到下一个拆分点的键,但不包含下一个拆分点的键。以此类推直到分裂完成。最后一个 region 将从最后一个分割点定义到最大可能的键。

hbase>create 't1','f',SPLITS => ['10','20','30']

在下面的例子中,创建了一个列簇 f 的表 t1,预分4个区,第一个 region 包含从 '\x00' - '\x30' 的所有 key('\x31' 是 ASCII码中的 1)。

可以使用 SPLITS_FILE 来指定一个文本文件,文件内写入拆分点。在本例中,从与本地文件系统上的本地路径对应的文件中读取分割。文件中的每一行都指定一个 split point key。

hbase>create 't14','f',SPLITS_FILE=>'splits.txt'

其他选项是根据所需的区域数量和分割算法自动计算分割。HBase 提供了基于均匀分割或基于十六进制键来分割键范围的算法,也可以提供自己的分割算法来细分键范围。

# 基于随机算法创建一个有4默认个分区的表
hbase>create 't2','f1', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' }

# 基于 hex keys 创建一个有5个默认分区的表
hbase>create 'app_second_card_trmnl_info_m_hbase_new_fenqu2','f1', { NUMREGIONS => 500, SPLITALGO => 'HexStringSplit' }

NUMREGIONS说明:

hbase 默认 HFile 的大小为 10G(hbase.hregion.max.filesize=10737418240=10G

源数据为 Hive:推荐分区数 HDFS大小 / 10G * 10 *1.2

HexStringSplit、UniformSplit、DecimalStringSplit说明:

  • UniformSplit(占用空间小,rowkey前缀完全随机​​​​​​​):将可能的键的空间平均分割的聚合体。当键是近似一致的随机字节时(例如散列),建议使用这个。行是范围为 00 => FF 的原始字节值,用0右填充以保持相同的 memcmp()顺序。对于byte[]环境来说,这是一种自然的算法,可以节省空间,但是对于可读性来说,它并不一定是最简单的。
  • HexStringSplit(占用空间大,rowkey是十六进制的字符串作为前缀的​​​​​​​):HexStringSplit 是一个典型的 RegionSplitter.SplitAlgorithm选择 region 边界。HexStringSplit region 边界的格式是MD5校验和或任何其他均匀分布的十六进制值的ASCII表示形式。Row是十六进制编码的长值,其范围为“00000000”=>“FFFFFFFF”,并左填充0,以使其在字典上保持与二进制相同的顺序。由于这种分割算法使用十六进制字符串作为键,所以在 shell 中方便读写,但是占用更多的空间,而且可能不够直观。
  • DecimalStringSplit:rowkey是10进制数字字符串作为前缀的

 

HBase Shell 实际上是一个 Ruby 环境,您可以使用简单的 Ruby 脚本来计算分割算法。

# generate splits for long (Ruby fixnum) key range from start to end key
hbase(main):070:0> def gen_splits(start_key,end_key,num_regions)
hbase(main):071:1>   results=[]
hbase(main):072:1>   range=end_key-start_key
hbase(main):073:1>   incr=(range/num_regions).floor
hbase(main):074:1>   for i in 1 .. num_regions-1
hbase(main):075:2>     results.push([i*incr+start_key].pack("N"))
hbase(main):076:2>   end
hbase(main):077:1>   return results
hbase(main):078:1> end
hbase(main):079:0>
hbase(main):080:0> splits=gen_splits(1,2000000,10)
=> ["\000\003\r@", "\000\006\032\177", "\000\t'\276", "\000\f4\375", "\000\017B<", "\000\022O{", "\000\025\\\272", "\000\030i\371", "\000\ew8"]
hbase(main):081:0> create 'test_splits','f',SPLITS=>splits
0 row(s) in 0.2670 seconds

=> Hbase::Table - test_splits

注意:HBase Shell 命令 truncate 删除并使用默认选项重新创建表,默认选项将丢弃任何预拆分。如果需要重置预分区表,则必须删除并显式重新创建该表,以重新指定自定义分区选项。

总结:建表时,对表进行预分区,可以防止单分区一次写入数据过大,hbase 集群本身还没来得及自动分裂,导致 region 宕掉的问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章