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

HBase RowKey与索引设计【精彩演讲PPT】 RowKey设计可以说是一个非常基础的话题,因为每一个HBase的使用/开发人员,都是从表/RowKey设计着手的。但细究起来,RowKey设计也有很多难点,尤其是如何与应用特点很好的结合起来。以下是该PPT的整体介绍思路: 这篇演讲的第一部分,先简单介绍了HBase的基础内容,而后探讨了RowKey在读写流程中所发挥的关键作用。这些基础内容,大部分已经在之前的文章中详细写过了: 一条数据... 阅读详情

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

2018年11月16日 08:18:53 Hadoop技术博文 阅读数:193

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

 

OpenTSDB 是基于 HBase 的可扩展、开源时间序列数据库(Time Series Database),可以用于存储监控数据、物联网传感器、金融K线等带有时间的数据。它的特点是能够提供最高毫秒级精度的时间序列数据存储,能够长久保存原始数据并且不失精度。它拥有很强的数据写入能力,支持大并发的数据写入,并且拥有可无限水平扩展的存储容量。目前,阿里云 HBase 产品是直接支持 OpenTSDB 组件的。

 

OpenTSDB 拥有如此的强大的读写和近乎无限的存储能力源自于基于 HBase 的架构设计,我们甚至可以说 OpenTSDB 就是 HBase 的一个应用。熟悉 HBase 的同学肯定知道,要看 HBase 的表设计的好不好,关键是看其 Rowkey 设计的好不好,HBase 的 Rowkey 设计会考虑到实际的查询场景。所以读到这里,大家肯定知道这篇文章是要讲什么内容的。

OpenTSDB 基本概念

在介绍 OpenTSDB 系统如何设计 Rowkey 之前,我们先来了解 OpenTSDB 的一些基本概念。(因为本文侧重于介绍 HBase 的 Rowkey 设计,所以关于 OpenTSDB 的其他一些知识本文并不会涉及,如果你对这部分知识感兴趣,请自行去网上搜索相关文章。)

我们往 OpenTSDB 里面写入一条时序数据,至少包含以下几个数据:

  • 指标名字:这个就是我们监控的指标,比如 sys.cpu.user; 

  • 时间戳:监控数据产生的时间; 

  • 值:Long 或者 Double 类型的数据,这个是监控指标在某个时间的具体值; 

  • 标签:包括标签名字(tagk)和标签值(tagv),比如 tagk1=tagv1,主要用于描述数据属性,每条时序数据必须包含一组和多组的标签数据。目前 OpenTSDB 最多支持8组标签。 

 

所以如果我们使用终端往 OpenTSDB 写入时序数据,格式如下:

 

put <metric> <timestamp> <value> <tagk1=tagv1[ tagk2=tagv2 ...tagkN=tagvN]>
比如
put sys.cpu.user 1541946115 42.5 host=iteblog cpu=0

OpenTSDB 的 Rowkey 设计

上面我们已经简单了解了 OpenTSDB 每条时序数据所包含的要素。基于这些时序数据,OpenTSDB 为我们提供的查询功能其实很简单:指定指标名称和时间范围,并且给定一个或多个标签名称和标签的值作为过滤条件,以此查询符合条件的数据。

Rowkey 设计版本一

OpenTSDB 为我们提供的查询业务场景已经有了,我们可以很快设计出 HBase 的 Rowkey:
metric + timestamp + tagk1 + tagv1 + tagk2 + tagv2 + ... + tagkn + tagvn
注意,实际存储的时候 + 并不会写入到磁盘,这里只是为了说明方便,人为加了这个符号。
比如如果我们往 OpenTSDB 插入下面的数据:

 

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

 

那么按照上面的思路 Rowkey 应该为:

sys.cpu.user+1541946115+host+iteblog+cpu+0

 

那如果这个指标有很多监控数据,其存储在 HBase 的 key-value 如下:

640?wx_fmt=png

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

Rowkey 设计版本二

上面表格记录着指标名 sys.cpu.user 标签为 host=iteblog cpu=0 和 标签为 host=iteblog cpu=1 每隔十秒的监控数据。有些同学可能已经看出来了,如果我们按照这样的方式去设计 HBase 表的 Rowkey,虽然可以满足我们的查询需求,但是这种存储数据的方式导致 Key 大量的重复存储,这样会导致数据的急剧增加,所以 OpenTSDB 并没有这样存储的。在 OpenTSDB 里面,会对每个指标名、标签以及标签值进行编码,每个指标的编码都不一样;同理,每个标签的编码也不一样,但是标签和指标名称可以编码一样,不同类型之间的编码互不影响。所以编码后的数据如下:

sys.cpu.user  => \x00\x00\x01
host => \x00\x00\x01
iteblog => \x00\x00\x01
cpu => \x00\x00\x02
0 => \x00\x00\x02
1 => \x00\x00\x03

在上面,OpenTSDB 默认使用三个字节来编码指标名称,三个字节编码标签名称以及标签值。经过这样的编码之后,OpenTSDB 的 Rowkey 就变成了下面的形式:

sys.cpu.user+1541946115+host+iteblog+cpu+0
变成
\x00\x00\x01+1541946115+\x00\x00\x01+\x00\x00\x01+\x00\x00\x02+\x00\x00\x02

所以上表的数据就变成下面的了:

640?wx_fmt=png如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

这样我们可以节省一些存储空间(不要看这张表好像比上面的表要长了,这里其实是用十六进制表示的,每个\x00占用一个字节,整个指标名称默认只占用三个字节,如果用字符串表示是不止三个字节的)。

Rowkey 设计版本三

但是细心的同学肯定发现了,上表中同一个指标每隔十秒发送一条监控数据,但是每条监控数据就只是当前指标的监控值,如上表的42.5、39.1、41.4、40.0。而每次发送的数据都在 HBase 里面存储一行,这样会导致重复存储大量相同的指标名、标签名、标签值等数据。我们仔细观察可以发现,Rowkey 组成中同一个指标的监控数据除了的时间不一样,其他都是一样的!基于这个特点,OpenTSDB 对 Rowkey 进行了进一步的优化,思想为:将 Rowkey 中时间戳由原来的秒级别或毫秒级别统一转换成小时级别的,多余的秒数据或者毫秒数据作为 HBase 的列名称。可能大家没有理解这句话的含义,下面我们来具体介绍这个实现。

1541946115 时间戳转换成时间为 2018-11-11 22:21:55,其对应的整点小时为 2018-11-11 22:00:00,这个转换成时间戳是 1541944800。1541946115 相对于 1541944800 多余出来的秒数为 1315,在 HBase 里面,1315 就作为当前指标对应值的列名。经过这样的优化之后,同一小时的监控数据都放在一行的不同列里面,所以上面的表格就变成下面的了:

640?wx_fmt=png如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

注意:

  • 第三张表中为了展示方便,我将 000001+1541944800+000001+000001+000002+000003 简写为 001+1541944800+001+001+002+003;

  • 上面几张表中的 Rowkey 部分我这里都是使用时间戳的形式显示的,只是为了查看方便,在实际存储中时间戳其实是以二进制形式存储的,比如 1541944800 的十六进制表示为 5BE835E0;所以上面表格中 Rowkey 为 001+1541944800+001+001+002+003 在 HBase 实际存储为(十六进制表示) 0000015BE835E0000001000001000002000003;

  • 第三张表中的列名称在实际存储中除了包含相对于 Rowkey 的秒数或者毫秒数,其实还包含了当前列值的数据类型,数据长度等标识。

     

 

如果说用一张图表示上面的过程,可以如下所示。

640?wx_fmt=png

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

 

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

纽扣电池供电系统优化:NBM5100A与STM32F745VG组合方案 在低功耗物联网设备设计中,能量管理是核心挑战之一。纽扣电池因其体积小、成本低被广泛采用,但瞬时大电流需求常导致电压骤降和寿命缩短。通过超级电容缓冲技术,可以实现能量的细水长流式存储与集中释放。NBM5100A电源管理IC与STM32F745VG微控制器的组合方案,采用双阶段能量管理架构,先以恒定小电流充电,再通过电容释放大电流。这种方案不仅能提升系统稳定性,还能延长电池寿命3-5倍,特别适合智能门锁、无线传感器等需要间歇性高功率输出的场景。 阅读详情

相关推荐

11种图像清晰度评价函数附MATLAB代码

博主的第一篇博客! 本科毕业论文是“基于图像处理的自动对焦技术研究”,对焦过程中的一个重要阶段是图像清晰度评价,博主自己用MATLAB实现了4类清晰度评价函数:基于图像梯度的清晰度评价函数、频域评价函数、信息熵评价函数、统计学评价函数,总计11种。博主之前没有用过MATLAB,完全是本科论文需要,没办法对着别人的代...

kungfu_rabbit的博客 5万+

从OpenTsdb来分析rowkey设计

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

酸奶王子 785

MOS管热阻的测量方法

实验室内如何测试mos管热阻

weixin_43492562的博客 4092

OpenTSDB介绍——基于Hbase的分布式的,可伸缩的时间序列数据库,而Hbase本质是列存储

OpenTSDB介绍1.1、OpenTSDB是什么?主要用途是什么?官方文档这样描述:OpenTSDB is a distributed, scalable Time Series Database (TSDB) written on top of HBase;翻译过来就是,基于Hbase的分布式的,可伸缩的时间序列数据库。主要用途,就是做监控系统;譬如收集大规模集群(包括网络设备、操作系统、应用...

CODE男孩的博客 6423

告别黑盒:深入解析西部数据UFS芯片的44个SMART健康参数(附高通XBL读取源码)

本文深入解析西部数据UFS芯片的44个SMART健康参数,结合高通XBL启动加载层源码,提供了一套完整的健康状态诊断方法论。从SCSI命令层封装到数据结构映射,详细介绍了如何在高通平台早期启动阶段捕获UFS健康状态,帮助工程师实现预测性维护。

weixin_30600197的博客 427

DDS信号发生器设计避坑指南:从AD9834配置到巴特沃斯滤波实战

本文详细解析了基于AD9834芯片的DDS信号发生器设计中的关键技术要点与常见陷阱,涵盖时钟源选择、寄存器配置时序、巴特沃斯滤波器设计等核心内容。针对中高频段信号质量优化,提供了实用的解决方案和代码示例,帮助工程师规避设计误区,提升信号发生器的性能和稳定性。

2y3u4i5o6p的博客 782

OpenTSDB基础概念、HBase的介绍

1、OpenTSDB的基础概念 2、HBase的逻辑存储、物理存储 3、HBase的组件及其工作过程

zx711166的博客 3581

使用ST-LINK烧录stm32教程说明

使用ST-LINK烧录stm32

qq_34426854的博客 1万+

OpenTSDB 在云原生环境中的应用: 实现高性能和可扩展性

1.背景介绍 OpenTSDB(Open Telemetry Storage Database)是一个高性能、可扩展的开源时间序列数据库,主要用于存储和检索大规模的时间序列数据。它是一个基于HBase的分布式数据库,可以轻松地处理百万级别的数据点和每秒钟的写入速度。在云原生环境中,OpenTSDB可以与其他云原生技术如Kubernetes、Prometheus等集成,以实现高性能和可扩展性。 ...

AI天才研究院 662

易盾滑块的js逆向分析

基于易盾的滑块验证码进行逆向分析,最种实现全系列的验证码逆向,包括滑块、点选、推理拼图等多种类型。

shanf7921的博客 3万+

python点云可视化

Python三种点云可视化方案:mayavi、matplotlib、CloudCompare。

叶子的博客 1万+

如何合理的设计HBase RowKey?

今天分享的内容主要是HBase RowKey与索引设计相关的一些技巧、原则和相关案例。内容包含四个部分:HBase基础原理速览;探讨合理的需求调研方法;RowKey与索引设计的常见技巧、原则;关于OpenTSDB/JanusGraph/GeoMesa典型案例的设计分析。 1.HBase基础 第一部分包括基础概念与数据模型介绍、快速浏览读写流程、介绍RowKey在读写流程中发挥的作用。 首先是...

tianyeshiye 1946

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

Hello,各位读者们好Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,我也是成功的找到了解决方案,对于ultralytics仓库进行多处改进从而让其还原RT-DETR官方的实验环境从而达到一比一的效果。同时本人一些讲解视频和包含我所有创新的RT-DETR文档。

Snu77的博客 3万+

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

通过例子剖析 OpenTSDB 的 Rowkey 及列名设计  HBase  2018-11-16 14:37:21 466  3评论 下载为PDF 为什么无法评论和登录   通过《OpenTSDB 底层 HBase 的 Rowkey 是如何设计的》 文章我们已经了解 OpenTSDB 底层的 HBase Rowkey 是如何设计的了。我们现在来测试一下 OpenTSDB 导入的时序数据到底...

大JAVA解决方案 436

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

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

HBase Rowkey 设计指南

为什么Rowkey这么重要RowKey 到底是什么我们常说看一张 HBase 表设计的好不好,就看它的 RowKey 设计的好不好。可见 RowKey 在 HBase 中的地位。那么 R...

过往记忆大数据 846

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OpenTSDB在HBase中的底层数据结构设计

0.时序数据库 时间序列(Time Series):是一组按照时间发生先后顺序进行排列的数据点序列,通常一组时间序列的时间间隔为一恒定值(如1秒,5分钟,1小时等)。 时间序列数据可被简称为时序数据。实时监控系统所收集的监控指标数据,通常就是时序数据 。时序数据具有如下特点: 每一个时间序列通常为某一固定类型的数值 数据按一定的时间间隔持续产生,每条数据拥有自己的时间戳信息 通常只会不...

猫不夜行的博客 410

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

openTSDB源码详解之rowKey生成

2018年11月13日 17:00:27LittleLawson阅读数:60更多 所属专栏:openTSDB实战 版权声明:如若转载,请联系作者。 https://blog.youkuaiyun.com/liu16659/article/details/84031862 openTSDB源码详解之rowKey生成 openTSDB的一个非常好的设计就是其rowKey的生成。下面详细介绍一下...

大JAVA解决方案 407

HBase RowKey的设计要点

HBase中的RowKey主要有以下的作用: 读写数据时通过Row Key找到对应的Region MemStore中的数据按RowKey字典顺序排序 HFile中的数据按RowKey字典顺序排序 底层的HFile最终是按照RowKey进行切分的,所以我们的设计原则是结合业务的特点,并考虑高频查询,尽可能的将数据打散到整个集群中。 RowKey的设计-Salting Salting的原理是...

qq_16220645的博客 339

opentsdb在Hbase的存储结构

1、opentsdb介绍 opentsdb是基于Hbase的分布式、可伸缩的时间序列数据库。 主要用途: 就是做监控系统 提供最高毫秒级精度的时间序列数据存储,能够长久保存原始数据并且不失精度 提供很强的写入能力,支持大并发的数据写入。 opentsdb 的简介就不过多的介绍。 2、OpenTSDB存储相关的概念 在opentsdb中存储的结构是以下面的结构写入的: { "metric": "单位的名字", "timestamp": db.TIME, "value":

hyy_blue的博客 1976

OpenTSDB原理系列-数据表设计

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

nosqlnotes的博客 2591

HBase Rowkey 设计

1、RowKey 到底是什么 我们常说看一张 HBase 表设计的好不好,就看它的 RowKey 设计的好不好。可见 RowKey 在 HBase 中的地位。那么 RowKey 到底是什么?RowKey 的特点如下: 类似于 MySQL、Oracle中的主键,用于标示唯一的行; 完全是由用户指定的一串不重复的字符串; HBase 中的数据永远是根据 Rowkey 的字典...

u013982921的专栏 317
上一篇: mongodb数据条目过期设置
下一篇: openTSDB源码详解之rowKey生成
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值