openTSDB源码详解之rowKey生成

OpenTSDB2.3.0安装部署 一、简介         OpenTSDB是基于HBase存储时间序列数据的一个开源数据库,但只是一个HBase的应用而已。也即是在HBase之上加了一层外壳,用于更好的处理时序数据库,真实的数据存储还是在HBase。          时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器 阅读详情

 

2018年11月13日 17:00:27 LittleLawson 阅读数:60更多

所属专栏: openTSDB实战

版权声明:如若转载,请联系作者。 https://blog.youkuaiyun.com/liu16659/article/details/84031862

openTSDB源码详解之rowKey生成

openTSDB的一个非常好的设计就是其rowKey的生成。下面详细介绍一下。

1.相关处理类

openTSDB往hbase中写入数据的处理过程,我之前就已经分析过,主要涉及的类有:

  • addPointInternal(...)
    在这里插入图片描述

这里主要讲解的是,如何一个row key是如何生成的。

2.具体步骤

2.1 row_size的确定

2.1.1 SALT_WIDTH

首先对于一个rowKey,肯定是有大小的,但是这个rowKey的大小该怎么确定呢?因为这个rowKey是需要写入到HBase中的,也就是需要通过网络的传输才能到达HBase端,所以不可能无限长,即需要精确到一个具体的长度。
openTSDB中的rowKey的大小用变量row_size表示。其具体的生成规则如下图所示:
在这里插入图片描述其中的 SALT_WIDTH()函数返回的是SALT WIDTH,它是一个static修饰的int型变量,初始值为0,如下图所示:
在这里插入图片描述

2.1.2 metric_width,tag_name_width,tag_value_width

metric_width 代表的就是metric的长度。在openTSDB系统中,默认的长度是3。该值来自tsdb.metrics.width()函数的返回值。
在这里插入图片描述

width() 方法如下:
在这里插入图片描述
而id_width的值设置过程如下:
在这里插入图片描述在这里插入图片描述
调用构造函数UniqueId(...)的过程如下:
在这里插入图片描述
最终可以看到这些值默认为3
在这里插入图片描述
针对笔者传输的数据,可以推导出最后生成的row_size的大小就是row_size = 0 + 3 + 4 + 3*1 + 3*1 = 13,经过debug验证,也可以看到的确就是13。

2.2 字节数组row

在这里插入图片描述

2.3 pos变量

在这里插入图片描述
问题1:使用pos变量的原因是,控制对字节数组row的复制控制【每将一个值复制到row[]之后,就需要动态改变row[]的起始位置,这个位置就是pos定义的】
因为我没有开启 加盐处理功能,所以这里的pos的初始值就是0。

2.4 为字节数组row赋值

在这里插入图片描述上述copyInRowKey(…)的功能就是将metric对应的uid值放入到row中。而其中的 getOrCreateId()方法则是获取metric对应的uid值。该方法主要调用的其它方法如下:

  • getIdAsync() 方法
    在这里插入图片描述

  • 从缓存中获取uid
    在这里插入图片描述

  • Deferred 类的构造方法
    在这里插入图片描述

  • copyInRowKey()方法
    在这里插入图片描述
    注意上面一张图中row和下面一张图的row的变化。这个变化就体现了将metric的id放到了rowKey中。
    在这里插入图片描述

2.5 pos值的变化

在这里插入图片描述因为已经处理了metric,所以需要将其pos自增一下。
同时,因为暂时不着急处理timestamp,所以再次将pos自增处理。

2.6 tag pair的处理

在这里插入图片描述
最后,需要在row中放入 tag pair,方式是采用for循环处理。
主要调用方法如下:

  • resolveOrCreateAll()
    在这里插入图片描述
  • resolveAllInternal()方法
    在这里插入图片描述

2.7 row的大致部分

经过上述几个步骤的处理,则会生成一个row值:
在这里插入图片描述

2.8 rowKey的完善

上述的步骤只是生成了一个rowKey的框架,但是还没有完全生成一个rowKey,因为还有最后一个步骤。接着会进入WriteCB这个回调类,如下:
在这里插入图片描述
注意这里的offset的取值:metrics.width() + Const.SALT_WIDTH()这个是用于将当前value所在小时的时间戳放入到row中。所以需要偏移metrics.width() + Const.SALT_WIDTH() 这样的长度。这里使用base_time = 1542096000举例,在未执行Bytes.setInt()方法之前,row的值如下图示:

在这里插入图片描述
使用Bytes类的setInt()方法修改row的值。setInt()主要的是>>>运算,这个运算符的意思是指:右移指定的位数,左边的空白位置0。得到的row值如下:

在这里插入图片描述
可能有人会问,为什么使用的是Bytes.setInt()这个方法?要知道,openTSDB只是根据timestamp(实质是 base_time,这个base_time我在后面会补充介绍)去生成rowKey的一部分,所以这一部分是什么样的逻辑不重要了,重要的是这个逻辑需要保持相同的base_time 映射到固定的byte[] 值。而openTSDB在rowKey的生成过程中采取的方法就是使用>>>去处理(timestamp)base_time ,从而保证rowKey在base_time相同时,其base_time对应的rowKey部分也相同。

到这里,一个完整的rowKey就生成了。

3.其它

3.1 base_time字段的生成

这个base_time代表的值就是当前value传递过来所在的timestamp。例如:对于一个timestamp=1542088140,处理过程就是取该timestamp所在小时 0分0秒的timestamp值。这也能解释为什么opentsdb中的存储按照每小时进行行存储,而不是每个时间戳一行。
在这里插入图片描述
这个Const.MAX_TIMESPAN定义如下:

  /** Max time delta (in seconds) we can store in a column qualifier.  */
  public static final short MAX_TIMESPAN = 3600;
  • 1
  • 2

代表的是一个小时的秒跨度。对其MAX_TIMESPAN 取余之后,该余数就是秒数,再减去这个秒数就得到hh:00:00的值。
上面的值处理之后,得到的base_time值变为了1542085200。如下示:
在这里插入图片描述

OpenTSDB 2.2.1源码包与系统解析 时间序列数据库(Time Series Database, TSDB)是专为高效存储和查询按时间排序的数据而设计的数据库系统。随着物联网、云计算和智能设备的迅猛发展,时间序列数据呈现爆炸式增长,传统关系型数据库在处理此类数据时面临写入性能瓶颈、查询效率低下以及扩展性不足等问题。OpenTSDB作为构建在HBase之上的分布式时间序列数据库,凭借其高可用、可扩展和高性能的特性,广泛应用于监控系统、实时数据分析和工业物联网等领域。 阅读详情

相关推荐

Origin绘制带差异显著性标记的分组均值条形图|科研论文图表教程(附数据格式模板)

传统柱状图虽能呈现组间均值差异,却隐藏个体数据分布;散点图虽能展示原始数据,却难以直观凸显统计显著性。带差异显著性(*)的分组均值条形图——它以“双层叙事”的创新设计,同时呈现群体特征与个体差异。

weixin_50236590的博客 1493

从OpenTsdb来分析rowkey设计

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

酸奶王子 785

【生成C01/C10材料常数excel表】

计算橡胶件的邵尔硬度和C01/C10材料常数

weixin_46153372的博客 1934

OpenTSDB时序数据库概述

OpenTSDB时序数据库概述

u011250186的博客 2538

实测338MB/s!FPGA与CYUSB3014的Slave FIFO模式实战避坑(附完整固件与源码)

本文详细介绍了FPGA与CYUSB3014在Slave FIFO模式下实现338MB/s高速数据传输的实战经验。通过优化硬件设计、固件配置和GPIF II接口设置,解决了USB3.0双向通信中的关键性能瓶颈,并提供了完整的固件与源码参考。

weixin_30570101的博客 458

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

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

u011250186的博客 693

如何利用VS2017创建一个简单的窗口

#如何利用VS2017创建一个简单的窗口 1、新建->Windows桌面向导 2、应用程序类型->桌面应用程序,点击确定 3、点击调试->开始调试 可建立如下图的窗口 4、可以在生成的项目文件的中找到windows17_2的应用程序,打开界面如下: 注:新建空白项目也可以,注意在解决方案资源器中添加.cpp文件,如源.cpp文件,下载代码见博文 ...

weixin_46894139的博客 2914

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

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

大JAVA解决方案 436

RK3588上从零部署Facenet人脸识别:PyTorch转ONNX再到RKNN的完整避坑指南

本文提供了在RK3588开发板上从零部署Facenet人脸识别模型的完整指南。详细介绍了从PyTorch模型导出、转换为ONNX格式,再通过RKNN-Toolkit2转换为RKNN格式的完整流程,并重点分享了环境配置、算子兼容性处理、量化调优及板端部署中的关键步骤与避坑经验。

river的博客 464

Autosar诊断实战系列23-NRC优先级解析

NRC分类,优先级判断逻辑及测试注意事项介绍。

initiallizer的博客 2617

opentsdb源码分析--生成rowkey

qq234568970的博客 688

基于STM32L4XX 、HAL库的TMC2226-SA-T步进电机驱动器驱动程序应用设计

集成的功率MOSFET可处理高达2A RMS的电机电流,并具备保护与诊断功能,确保运行稳健可靠。作为业界最先进的STEP/DIR步进电机驱动系列,该芯片通过升级设计实现无噪音、高精度运行,为用户提供高性价比且极具竞争力的解决方案。// 用于PDN_UART单线通信。// HAL_UART_Transmit - 注意PDN_UART是单线,收发共线。.huart = &huart1, // PDN_UART连接的USART。均方根步进/方向控制接口,提供8、16、32或64微步针设置,

PP_Cottage的博客 625

openTSDB compaction 机制探究

openTSDB 介绍 openTSDB是基于Hbase的分布式的,可伸缩的时间序列数据库,作为时序性数据库,能作为监控系统 ,目前openTSDB支持秒级别的数据查询存储,并且数据会持久化保存在HBase表中,在官方文档,给出以下架构 1.为什么会需要做compact 这就要先介绍以下,openTSDB的数据在HBase的存储了,这里有个HB阿瑟数据表 tsdb表,这里面保存了 openTSD...

weixin_43885038的博客 1106

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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版本:2.3.0

转载请注明出处:http://blog.youkuaiyun.com/u012842205/article/details/72817966一、简介        OpenTSDB是基于HBase存储时间序列数据的一个开源数据库,但只是一个HBase的应用而已。也即是在HBase之上加了一层外壳,用于更好的处理时序数据库,真实的数据存储还是在HBase。         时序数据是基于时间的一系列的数据。在有...

大JAVA解决方案 1127

DataX OpenTSDBReader 插件深度解析:基于 HBase Scan 的高性能时序数据读取方案

OpenTSDBReader 是 DataX(阿里云 DataWorks 数据集成开源版本)中负责从 OpenTSDB 时序数据库读取数据的 Reader 插件。它绕开 OpenTSDB 的 HTTP 查询接口,通过 `/api/config` 获取底层 HBase 连接信息后直连 HBase,以 Scan 方式扫描数据点,并通过"metric × 小时"切片将大任务拆分为细粒度子任务实现高吞吐迁

gitblog_02116的博客 737

OpenTSDB 的唯一ID(UniqueId)

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

zx711166的博客 2451

OpenTSDB简介

  OpenTSDB(Open time series data base),开发时间序列数据库。DB这个词很有误导性,其实并不是一个db,单独一个OpenTSDB无法存储任何数据,它只是一层数据读写的服务,更准确的说它只是建立在Hbase上的一层数据读写服务。行业内各种db都很多了,为什么还会出现它?它到底有什么好?它做了什么?别着急,我们来一一分析下。   其实OpenTSDB不是一个通用......

xindoo 2万+

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

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

Hadoop技术博文 1174

OpenTSDB设计解读

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

Laurence的技术博客 4万+
上一篇: OpenTSDB 底层 HBase 的 Rowkey 是如何设计的
下一篇: OpenTSDB原理系列-数据表设计
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值