OpenTSDB PreSplit Table

Reference Issure
Ref2

  1. 如果metric热度相差不大,即没有某些metric的time series特别多,比如百万级别,而某些metric的time series特别少,比如千级别。
    pre split 设计可以如下:
    start key: \x00\x00\x01
    end   key: \x00\x08\x00  // 假设有2048个metrics
    按照这个范围平均切分 256 个
  1. 如果metric热度相差很大,那么上述的设计可能就不太合理,因为有可能非常热的几个metric分在同一个region. 这种情况下的解决办法比较tricky: 先提取热度较大的metric, 手动预先为其分配UID, 然后每个或者两个可以作为一个region的start key, end key.
    比如:
    metric1, metric2, metric2热度较大, metric3, metric4 .....热度一般
    1. 预先分配UID(参见具体的工具)
    metric1 -> \x00\x00\x01;   metric2 -> \x00\x00\x02;  metric3 -> \x00\x00\x03
    metric3, metric4......可以系统自动分配UID.
    pre split如下:
    前三个metric各自放到一个region, 即:
    region1   startkey: \x00\x00\x01  endkey: \x00\x00\x01
    region2   startkey: \x00\x00\x02  endkey: \x00\x00\x03
    region3   startkey: \x00\x00\x03  endkey: \x00\x00\x04
    剩下的就可以按照1的办法搞定。

切分脚本(jRuby):

#!/usr/bin/hbase org.jruby.Main
# usage: ./create_table.rb tsdb 255
include Java
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.HTableDescriptor
import org.apache.hadoop.hbase.client.HBaseAdmin
import org.apache.hadoop.hbase.HColumnDescriptor

tablename = ARGV[0]
regions = ARGV[1].to_i

hcd  = HColumnDescriptor.new('t')
#hcd.COMPRESSION="COMPRESSION"
#hcd.BLOOMFILTER="BLOOMFILTER"

htd = HTableDescriptor.new(tablename)

htd.addFamily(hcd)
HBaseAdmin.new(HBaseConfiguration.new).createTable(
  htd,
  "\x00\x00\x01".to_java_bytes,
  "\x00\x03\x48".to_java_bytes,
  regions)

使用方法: \x00\x00\x01 换成第一个metric的UID, \x00\x03\x48换成最后一个metric的UID。 执行: ./create.rb tsdb 256 这样会预切分256个region.
这样会预切分256个region.

总结:由于预先评估罗列那些metric的热度较高比较困难,目前就采用第一种方式:确定metric的个数,然后根据startkey, endkey的范围平均切分region。如果后期发现某些region的访问热度特别高,然后在针对这个region做手动切分。

你可能感兴趣的:(大数据-OpenTSDB)