OpenTSDB rowKey 设计

开始原因:
  1. 因为裁员被优化了, 开始准备面试, 算是整理自己最近一年多的学习经历
  2. 前段时间开始阅读部分 OpenTSDB 的源码, 想着结合源码记录一下
接触情况
  1. 17年大三的时候, 老师有一个项目设计到传感器的数据存储, 在 openTSDB 和 influxdb 中选择了 influxdb, 那时候没搞过 bigdata, 自然也就不会整 hadoop 集群
  2. 实习的第一份工作, 涉及到数字货币交易的 k 线数据, 当时的想法是用所有报价信息经过采集后发送到 kafka 中, flink consum kafka 的数据然后写入 OpenTSDB
  3. 第二份工作也用到了 openTSDB, 解决用户统计结果数据的时间维度切割问题, 例如统计用户最近 1、2、3 天的盈利情况
  4. 推荐一个 OpenTSDB 的 java client:aliyun-tsdb-java-sdk, 有些部分还需要修改才能连接原生的 openTSDB
OpenTSDB 在 hbase 中表的设计
  1. OpenTSDB 依赖 HBase, 所有数据都存储在 HBase 下面的 4 张表中


    image.png
  • tsdb-uid: 为了减少 rowkey 的长度, OpenTSDB 将 metric、tagk、tagV 进行编码,映射成 UID 存放在 tsdb-uid 表中, 包含两个 colunm family:id 、name, 每个列族下有 3 列,分别为: metric、tagk、tagv
  • tsdb: 保存所有 OpenTSDB 数据的地方
  • tsdb-tree:
  • tsdb-meta:
  1. 写入一条数据后 tsdb 中每个表的变化情况
    1): 往 openTSDB_host_name:4242/api/put put 一条json 字符串数据:
{
    "metric": "sys.cpu.nice",
    "timestamp": 1346846400,
    "value": 18,
    "tags": {
       "host": "web01",
       "dc": "lga"
    }
}

2): tsdb-uid 表的变化:


image.png

字符串到编码的映射:
sys.cpu.user => \x00\x00\x01
host => \x00\x00\x01
web01 => \x00\x00\x01
dc => \x00\x00\x02
lga => \x00\x00\x02

以上就是 OpenTSDB 对写入 metric、tagk、takv 的编码

3): tsdb 表变化


image.png

其中这条数据的 rowkey 为: \x00\x00\x01PG>\xC0\x00\x00\x01\x00\x00\x01\x00\x00\x02\x00\x00\x02
可以分解为如下部分

  • metric: \x00\x00\x01 为 tsdb_uid 中 sys.cpu.user 的编码
  • base_time: PG>\xC0 为 timestamp/3600 对应的小时时间:1346846400 的编码
  • tagk: \x00\x00\x01 为 tsdb_uid 中 host 的编码
  • tagv: \x00\x00\x01 为 tsdb_uid 中 web01 的编码
  • tagk: \x00\x00\x02 为 tsdb_uid 中 dc 的编码
  • tagv: \x00\x00\x02 为 tsdb_uid 中 lga 的编码

列族 column t 的值为: \x00\x00 为: 1346846400(timestamp) - base_time(timestamp/3600) 的编码
value 的值为 : \x12 为 18 的编码表示,源码中是这样计算的: ((timestamp - base_time) << 4 | 0)

所以整个 rowkey 的都是由 tsdb-uid 中的编码拼接而成:
metric+base_time+tag1k+tag1v+tag2k+tag2v+....+tagnk+tagnv

你可能感兴趣的:(OpenTSDB rowKey 设计)