通过例子剖析 OpenTSDB 的 Rowkey 及列名设计

OpenTSDB 2.3 中文文档 OpenTSDB 2.3 中文文档 OpenTSDB 2.3 中文文档 OpenTSDB 2.3 中文文档 立即下载

通过例子剖析 OpenTSDB 的 Rowkey 及列名设计

 HBase  2018-11-16 14:37:21 466  3评论 下载为PDF 为什么无法评论和登录

 

通过《OpenTSDB 底层 HBase 的 Rowkey 是如何设计的》 文章我们已经了解 OpenTSDB 底层的 HBase Rowkey 是如何设计的了。我们现在来测试一下 OpenTSDB 导入的时序数据到底长什么样子。

在 OpenTSDB 里面默认存时序数据的表为 tsdb。前面说了,每个指标名称、标签名称以及标签值都有唯一的编码,这些编码数据是存放在 tsdb-uid 表里面。为了更加深入的了解 OpenTSDB 的 Rowkey 设计,下面我们通过往 OpenTSDB 里面插入一些测试数据,来加深理解。我们准备插入 OpenTSDB 的数据如下:

put sys.cpu.user 1541946115 42.5 host=iteblog cpu=0

put sys.cpu.user 1541946135 53.2 host=iteblog cpu=0

put sys.cpu.user 1542206107124 55 host=iteblog cpu=0

我们通过命令行往 OpenTSDB 插入上面的数据。执行完上面三个语句,我们来看下 tsdb 和 tsdb-uid 两张表的数据长什么样子:

OpenTSDB Rowkey Design
如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

从上面的输出也可以看出,tsdb-uid 表就是存储的是标签名字、标签值以及指标名字的编码,以及编码和标签名字、标签值、指标名字的关系。我们可以看到指标名字 sys.cpu.user、标签名字 host 和标签值 iteblog 的编码均为 \x00\x00\x01;而标签名字 cpu 和其对于的标签值 0 编码均为 \x00\x00\x02。从这里可以说明以下几个问题:

  • 同一类数据的编码只能唯一。比如指标名字的编码必须唯一,不存在一个指标编码对应多个指标名称;
  • 不同类的数据编码可以相同。比如前面 sys.cpu.user、标签 host 和标签值 iteblog 的编码均为 \x00\x00\x01,因为它们之间是无影响的。

tsdb-uid 表中 Rowkey 为 \x00 的三行中的 id:metrics、id:tagk 以及 id:tagv 分别表示对应的指标名字、标签名字、标签值当前最大的编码。

tsdb 表里面有三行数据,这就是我们存储的上面插入的数据的。我们可以看到第一行和第二行的 Rowkey 是一样的,只是列名不一样,这两行对应的是上面 put 的前两行数据。现在我们来分解这个 Rowkey:
\x00\x00\x01[\xE85\xE0\x00\x00\x01\x00\x00\x01\x00\x00\x02\x00\x00\x02
我们主要来分析时间戳,见上面加粗的部分。为什么会显示 [ 呢?其实这里显示的是 ASCII 对应的字符,所以这四个字节([\xE85\xE0)对应的十六进制是 5BE835E0,转换成十进制是 1541944800,这个正式我们前面分析的 2018-11-11 22:00:00 对应的时间戳。

 

接着我们来分析列名column=t:R; 这个其实也是 ASCII 对应的字符,十六进制显示为 523B,二进制表示为 101001000111011。我们前面说过,其实列名里面除了相对的秒数,其实还有当前列值得类型、值长度的信息。

在 介绍如何解析列名之前,我们先来了解一些前提知识。在 OpenTSDB 里面,如果 Rowkey 里面的时间戳只到秒级别的,那么列名称占用2个字节。
其中后面三位代表当前列值占用的字节数。

 

  • 如果后三位为100,代表当前列值占了8字节;
  • 如果后三位为011,代表当前列值占了4字节;
  • 如果后三位为010,代表当前列值占了2字节;
  • 如果后三位为000,代表当前列值占了1字节;
  • 其他情况就是异常的。

倒数第四为代表当前列值的类型,

  • 如果为0,则代表整型数据;
  • 如果为1,则代表四字节浮点型数据。

前面12位才表示相对于 Rowkey 的秒数。

如果 Rowkey 里面的时间戳只到毫秒级别的,那么列名称占用4个字节。其中

  • 最前四位固定为全1;
  • 最后面四位的含义和前面一样;
  • 倒数第5-6位为预留位;
  • 其他的位才是真正的相对于 Rowkey 里面毫秒数。

所以列 column=t:R(二进制 101001000111011)可以按照上面的规则进行解析:

  • 前12位二进制为 10100100011,十进制为 1315,这个就是我们前面分析的秒数!
  • 倒数第四位为1,也印证了我们的数据类型为浮点型。
  • 后三位为011,说明我们的数据值占用了4字节。

现在我们来解析 column=t:R 列对应的值。如上图所示,这列对应的值为 B*\x00\x00,这个其实也是 ASCII 对应的字符,对应的浮点型十六进制是 422A0000,由于其实一个浮点数,所以可以将这个十六进制转成十进制,数据为 42.5,这就是我们 put 进去的数据啊。

现在我们来解析上图中的第三行数据。我们可以看到,上面第三个 put 我们的时间戳精确到毫秒级别,所以我们需要按照上面的规则拆分 column=t:\xF8\x09\xBD\x00,我们可以将 \xF8\x09\xBD\x00 使用二进制表示:11111000000010011011110100000000,我们对这个二进制解析如下:

  • 这个二进制的前4位均为1;
  • 倒数3位为 000,说明当前列对应的值占用了一个字节;
  • 倒数第4位为0,说明当前列对应值的类型为整型数据;
  • 除了前4位和后六位的二进制,剩下的就是相对于 Rowkey 的毫秒数,剩下的二进制为 1000000010011011110100,十进制为 2107124。这个值正是 1542206107124 (2018-11-14 22:35:07)相对于 1542204000000(2018011014 22:00:00) 多出来的毫秒数。

现在我们来解析 column=t:\xF8\x09\xBD\x00 列对应的值。从上图可以看出,这列的值为 7,其实这是 ASCII 字符,7对应的 ASCII 编码十六进制为 37,十进制是 55,这不就是前面第三个 put 插入的值嘛。

正是因为 OpenTSDB 的这种 Rowkey 设计,才使得 OpenTSDB 能够提供最高毫秒级精度的时间序列数据存储,能够长久保存原始数据并且不失精度。它拥有很强的数据写入能力,支持大并发的数据写入,并且拥有可无限水平扩展的存储容量。

TPAMI 2025新作LRFormer复现笔记:我的Windows 11 + RTX 4090配置全流程 本文详细记录了在Windows 11系统下使用RTX 4090显卡复现TPAMI 2025顶会论文LRTransformer的完整流程,包括硬件配置、系统优化、Python环境搭建及模型训练中的常见问题解决方案。特别针对Windows平台特有的路径管理、CUDA版本冲突和显存优化等关键技术细节提供了实用指南,帮助开发者高效完成环境搭建和模型训练。 阅读详情

相关推荐

Unity中的坐标系及其转换方法

Unity中的坐标系及其转换方法 Unity中有四种坐标系: 1.全局坐标系 World Coordinate System 全局坐标系是用于描述场景内所有物体位置的方向的基准,也称为世界坐标系,Unity中创建的物体都是以全局坐标系中的坐标原点(0,0,0),来确定各自的位置的,可以使用transform.position来获取游戏对象的世界坐标。 2.局部坐标系 Local Coordinate System 局部坐标系也称为模型坐标系或物体坐标系,每个物体都有自身独立的物体坐标系。当物体移动或改变方向

Z_hongli的博客 8179

OpenTSDB时序数据库概述

OpenTSDB时序数据库概述

u011250186的博客 2538

【GEE实战指南】Python本地API配置避坑与一站式环境搭建

本文详细介绍了Google Earth Engine(GEE)Python本地API的配置避坑指南与一站式环境搭建流程。通过conda创建隔离环境、账户认证关键步骤、初始化代码的正确写法以及实战测试案例,帮助开发者快速掌握GEE Python API的配置技巧,避免常见错误,提升地理空间数据分析效率。

weixin_42624889的博客 186

从OpenTsdb来分析rowkey设计

讨论此问题前,先理解一个问题。 关于Hbase热点问题 当处理由连续事件得到的数据时,即时间上连续的数据。这些数据可能来自于某个传感器网络、证券交易或者一个监控系统。它们显著的特点就是rowkey中含有事件发生时间。带来的一个问题便是HBase对于row的不均衡分布,它们被存储在一个唯一的rowkey区间中,被称为region,区间的范围被称为Start Key和End Key。 对...

酸奶王子 785

汇川伺服Modbus-RTU通讯实战:从帧结构解析到西门子PLC配置

本文详细解析了汇川伺服与西门子PLC通过Modbus-RTU协议进行通讯的实战步骤,包括帧结构解析、硬件连接、参数设置及PLC程序配置。通过具体案例和常见问题排查指南,帮助工程师快速掌握工业自动化中的通讯技术,提升设备调试效率。

weixin_33670713的博客 453

在Simulink中进行基于模拟信号数字化处理的仿真

模拟信号数字化处理通常包括以下几个步骤:采样、量化、编码以及数字信号处理(如滤波、变换等)。Simulink提供了丰富的模块库,可以方便地实现这些步骤,并支持对整个系统的实时仿真与调试。首先明确你的系统需求,比如输入信号类型(正弦波、方波等)、采样率、需要执行的数字信号处理操作(低通滤波、频谱分析等)。假设我们需要处理一个50Hz的正弦波信号,采样率为1kHz,并希望对该信号进行低通滤波以去除高频噪声。本文介绍了如何在Simulink中进行基于模拟信号数字化处理的仿真。

xiaoheshang_123的博客 625

openTSDB源码详解之rowKey生成

openTSDB源码详解之rowKey生成过程 openTSDB的一个非常好的设计就是其rowKey的生成。下面详细介绍一下。 1.相关处理类 openTSDB往hbase中写入数据的处理过程,我之前就已经分析过,主要涉及的类有: addPointInternal(...) 这里主要讲解的是,如何一个row key是如何生成的。 2.具体步骤 2.1 row_size的确定 2.1.2 SA...

说文科技,做有态度的研究。 1118

5、癌症数据预处理技术与深度学习在癌症预测中的应用

本文详细介绍了癌症数据预处理技术和深度学习在癌症预测中的应用。针对CT扫描图像、X射线图像、超声图像、基因表达数据和文本数据等不同类型的癌症数据,分别阐述了去噪、插值、配准、归一化等预处理技术的具体方法。同时,分析了深度学习在乳腺癌、白血病和宫颈癌预测中的作用,结合相关影响因素探讨了模型的应用潜力。此外,还总结了深度学习在癌症预测中面临的挑战及未来发展方向,为癌症的早期诊断与精准预测提供了理论支持和技术参考。

alice7model的博客 123

OpenTSDB 的唯一ID(UniqueId)

RowKey设计 OpenTSDB 底层存储使用的是 HBase,HBase 将表中的数据按照 RowKey 切分成 HRegion,然后分散到集群的 HRegion Server 中存储并提供查询支持。 OpenTSDB 中可以通过 metric+tag 组合的方式确定唯一一条时序数据,因此 OpenTSDB 在设计 HBase RowKey 的时候就包含了 metric、tag、base_ti...

zx711166的博客 2451

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。10. 注意,如果从移动设备浏览器连接服务,信令服务器的SSL证书一定要先设好。想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。8. 打开电脑浏览器,地址栏输入http://127.0.0.1,点击Receiver Sample。新建Unity项目,模板选Third Person,Project Name随意。启动App,控制台出现如下信息表示成功。

每日出拳老爷子的博客 2518

rk3576 适配摄像头 (mipi 五摄)

在RK3576上实现五路CSI摄像头方案,核心思路是充分复用其视频输入接口,并通过巧妙的软件配置来实现。

weixin_35723192的博客 180

分析 OpenTSDB中 tsdb 表设计

如下图是tsdb的数据:hbase(main):003:0> scan 'tsdb' ROW COLUMN+CELL \x00\x00\x01U\x9C\xAEP\x00\x column=t:q\x80,timestamp=1436350142588, value=\x17 00\x01\x00\x00\x01\x00\x00\x 02\...

杨鑫newlife的专栏 2411

基于毫米波雷达的智能风扇算法设计与实现

摘要:本文设计了一种基于毫米波雷达的智能风扇控制系统,采用FMCW雷达实现人体目标的精准检测与定位。系统通过距离FFT、速度FFT、CFAR检测和AoA估计构建完整的信号处理链路,并针对风扇叶片干扰设计了基于自相关函数的抗干扰算法。创新性地提出了人在开机、多人优先送风、摇头追踪等控制策略。研究采用MATLAB完成全链路算法仿真验证,并在STM32平台上实现实物系统。实验表明,该系统可实现0.15m测距精度和±60°方位角覆盖,有效解决了传统风扇的能源浪费和用户体验问题。本文提供了完整的MATLAB仿真代码和

huanghm88的专栏 404

解密OpenTSDB的表存储优化

简介:本篇文章会详细讲解OpenTSDB的表结构设计,在理解它的表结构设计的同时,分析其采取该设计的深层次原因以及优缺点。它的表结构设计完全贴合HBase的存储模型,而表格存储(TableStore、原OTS)与HBase有类似的存储模型,理解透OpenTSDB的表结构设计后,我们也能够对这类数据库的存储 摘要 OpenTSDB是一个分布式的、可伸缩的时间序列数据库,在DB-engines的时间序列数据库排行榜上排名第五。它的特点是能够提供最高毫秒级精度的时间序列数据存储,能够长久保存原始...

萧曳丶 364

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

解密OpenTSDB的表存储优化【转】

https://yq.aliyun.com/articles/54785 摘要:本篇文章会详细讲解OpenTSDB的表结构设计,在理解它的表结构设计的同时,分析其采取该设计的深层次原因以及优缺点。它的表结构设计完全贴合HBase的存储模型,而表格存储(TableStore、原OTS)与HBase有类似的存储模型,理解透OpenTSDB的表结构设计后,我们也能够对这类数据库的存储 ...

dianzhouyu2189的博客 121

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

opentsdb在HBase中表结构设计

摘要  OpenTSDB是一个分布式的、可伸缩的时间序列数据库,在DB-engines的时间序列数据库排行榜上排名第五。它的特点是能够提供最高毫秒级精度的时间序列数据存储,能够长久保存原始数据并且不失精度。它拥有很强的数据写入能力,支持大并发的数据写入,并且拥有可无限水平扩展的存储容量。 它的强大的数据写入能力与存储能力得益于它底层依赖的HBase数据库,也得益于它在表结构设计上做的大

wyl6019的博客 3465

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OpenTSDB 的UID

OpenTSDB 的UID

一杯咖啡半杯糖的博客 686

时序数据库系列文章(七)—OpenTSDB

时序数据库系列文章(七)—OpenTSDB

u011250186的博客 693

OpenTSDB设计解读

OpenTSDB是基于HBase存储时间序列数据的一个开源数据库,确切地说,它只是一个HBase的应用而已,其对于时间序列数据的处理可以供其他系统参考和借鉴。本文会针对它在数据库的设计方面展开一些探索和讨论。本文基于的是OpenTSDB最早的一个稳定版本1.0.0进行讲解的,下载部署完成之后,我们首先需要了解的是它的数据库Schema, 它主要有两个表:tsdb-uid和tsdb. 前者描述指标(

Laurence的技术博客 4万+

大数据技术之HBase(四)RowKey设计原则及方法

检索HBase的记录首先需要通过RowKey来定位数据行。当大量的client访问hbase集群的一个或少数几个节点,造成少数regionServer的读/写请求过大,或负载过大,而其他的regionServer负载却很小。这就是 “热点” 现象。

five小点心的博客 1652

OpenTSDB 底层 HBase 的 Rowkey 是如何设计的

在https://www.iteblog.com/archives/2450.html文章中有实际的案例分析 Rowkey 如何设计的,感兴趣的可以点击下面阅读原文去查看...

Hadoop技术博文 1174

【Redis】Redis基本数据类型及其常见的操作命令

Redis基本操作命令

qq_27198345的博客 568

OpenTsdb 核心设计

RowKey设计openTsdb的rowkey设计充分利用了HBase中索引信息仅在rowkey中的特点,它将指标metric,时间戳,数据值,tag标签名,tag标签值都包含在rowkey中,具体的设计如下图所示: 如上图按照metric_name timestamp tagk tagv的顺序链接起来形成rowkey, 同时考虑到metric_name, tagk, tagv在连续不同时间存储的

MT——黑板报 2971

Opentsdb On Hbase 设计 region 预分区

Opentsdb On Hbase 设计 region 预分区 如何查看region读写是否分布均匀 方法一: 通过hbase webui页面 a) 查看opentsdb.conf 中 指定的存储数据点的HBase表名 由此得知表名是tsdb b) 通过hbase ui 查看数据分布 hbase版本不同查看方式会有出路 方法二:通过查看hdfs目录结构 c) 查看hdfs目录下文件大小是否平衡 如何设计hbase rowkey Opentsdb源码中 rowkey生成 插入数

治愈系的博客 694

OpenTSDB原理系列-数据表设计

上一篇文章《OpenTSDB原理系列-元数据模型》讲到了OpenTSDB的基础概念,以及元数据模型,这篇文章介绍OpenTSDB的HBase数据表设计。OpenTSDB共涉及两种类型的数据:Metrics数据以及Annotation(注释)数据,在将这些数据存到HBase表中时,针对RowKey, Qualifier以及Value信息都做了特殊设计,从而使得存储更加高效。Metrics RowKe...

nosqlnotes的博客 2591
上一篇: OpenTSDB 生产应用与思考
下一篇: OpenTSDB配置安装
王树民
博客等级 码龄10年 912粉丝 560原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值