您的位置:首页 > 运维架构

OpenTSDB PreSplit Table

2016-01-05 17:51 369 查看
Reference Issure

Ref2

如果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做手动切分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: