- 如果metric热度相差不大,即没有某些metric的time series特别多,比如百万级别,而某些metric的time series特别少,比如千级别。
pre split 设计可以如下:
start key: \x00\x00\x01
end key: \x00\x08\x00 // 假设有2048个metrics
按照这个范围平均切分 256 个
- 如果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做手动切分。