【翻译】OpenTSDB 2.3 文档--聚合

聚合

OpenTSDB旨在通过查询有效地组合多个不同的时间序列。这样做的原因是,当用户查看他们的数据时,他们通常会从较高的级别开始询问诸如“数据中心的总吞吐量是多少?”之类的问题。或“按地区划分的当前用电量是多少?”。在查看这些高级别值之后,可能会出现一个或多个值,因此用户可以深入研究更详细的数据集,例如“我的LAX数据中心主机的吞吐量是多少?”。我们希望能够轻松回答这些高级问题,但仍然可以深入了解更多细节。

但是,如何将多个单独的时间序列合并为一个系列的数据呢?聚合函数提供了以数学方式将不同时间序列合并为一个的方法。过滤器用于按标签对结果进行分组,然后将聚合应用于每个组(先进行分组,再进行聚合)。聚合类似于SQL的GROUP BY子句,用户选择预定义的聚合函数以将多个记录合并为单个结果。但是在TSD中,通过时间戳和组将聚合出一组记录。

每个聚合器都有两个组件:

  • Function - 应用的数学计算,例如对所有值求和,计算平均值或选择最高值。
  • Interpolation - 一种处理缺失值的方法,例如当时间序列A的值为T1但时间序列B没有值时,需要进行插值。

本文档重点介绍如何在一个组中按上下文使用聚合器,即将多个时间序列合并为一个。此外,聚合器可用于下采样时间序列(即返回较低分辨率的结果集)。有关更多信息,请参阅下采样

聚合

在将多组时间序列聚合或分组成为为一个时,每个组的时间序列中的时间戳都是对齐的。然后,对于每个时间戳,将所有时间序列中的值聚合为新的数值。也就是说,聚合将工作跨越时间序列的每个时间戳。将原始数据视为矩阵或表格,如以下示例所示,该示例说明sum聚合器在两个时间序列中的作用,A并B生成新的时间序列Output。


对于时间戳t0,对A和B的数据点进行求和,即5 + 10 = 15。接下来,将t1的两个值相加得到10,以此类推。在SQL中,这看起来像是SELECT SUM(value) FROM ts_table GROUP BY timestamp。

插值

在上面的例子中,时间序列A和B每个时间戳都有数据点,它们排列整齐。然而,当两个系列没有对齐时会发生什么?同步所有数据源以在同一时间写入数据可能是困难的,有时是不切实际的。例如,如果我们有10,000台服务器每5分钟发送100个系统指标,那么这将是一秒钟内的10M数据点突发。我们需要一个非常强大的网络和集群来适应这种流量。更不用说系统将闲置4分59秒。相反,随着时间的推移显示写入更有意义,因此我们平均每秒有3,333次写入,以减少我们的硬件和网络要求。

缺失数据
“缺失”只是意味着时间序列在给定的时间戳上没有数据点。通常,数据只是在请求的时间戳之前或之后进行时间移位,但如果源或TSD遇到错误并且未记录数据,则实际上可能会丢失数据。某些时序数据库DB可以允许在某个时间戳处存储NaN,以表示不可记录的值,但是OpenTSDB还不支持这样。

如何累加或找平均一个不存在的值?第一直觉就是返回有效的数据点并用这些数据来完成工作。但是,如果你像上面那样处理数千个数据点根本不对齐的数据源呢?例如,下图显示了未对齐写入的时间序列,导致锯齿状线条难以读取:
在这里插入图片描述

或者,您可以简单地忽略任何时间序列在时间戳上有丢失的数据点。但是如果你有两个时间序列并且它们只是未对齐,那么即使存储中有良好的数据,你的查询也会返回一个空的数据集,所以这不一定非常有用。

另一种选择是定义一个标量值(例如0或者Long的最大值)来代替丢失的数据。OpenTSDB 2.0及更高版本提供了一些聚合方法,用于替换缺失数据点的标量值,实际上,上图是使用zimsum聚合器生成的,该聚合器将未对齐值替换为零。这种替换有时候很有用,有时候却不一定有用。

OpenTSDB提供的一个答案是使用定义良好的插值数值分析方法来猜测该时间点的值。插值使用现有数据点作为时间序列,以在请求的时间戳处计算最佳猜测值。使用OpenTSDB的线性插值,我们可以平滑我们的未对齐图形,以获得:
在这里插入图片描述
对于数值示例,请查看这两个时间序列,其中源每20秒发出一次值,数据只是偏移10秒:
在这里插入图片描述

当OpenTSDB计算聚合时,它会从任何序列找到的第一个数据点开始,在这种情况下,在B中的数据是t0时刻的数据。我们请求A在t0时刻的值,t0但那里没有任何数据。我们知道A在t0+10s时有数据,但由于我们没有t0之前的数据,我们无法猜测A在t0时它会是什么。因此,我们只返回值B在t0的值。

接下来,我们访问A在时间t0+10s的数据,这个数据是存在的。但是我们取t0+10s时间序列的值,B但没有一个。但是B知道t0有一个值,t0+20s有一个值,所以我们现在可以猜测计算t0+10s的值。对于线性插值的公式是其中,公式就不列了,线性插值,结果是15.

迭代在每个时间戳上继续,对于作为查询的一部分返回的每个系列,找到数据点。使用sum聚合器生成的系列将如下所示:
在这里插入图片描述

更多示例: 对于图标,我们有以下示例。名为的虚拟度量标准m记录在OpenTSDB中。查询语句为start=1h-ago&m=sum:m。它由红线host=foo和绿线host=bar的和构成蓝线:
在这里插入图片描述

(说白的,上面那张图是按上面那种插值方式求和)从上图中可以直观地看出,如果你“叠加”红线和绿线,你就会得到蓝线。在任何离散时间点,蓝线的值等于红线的值与此时绿线的值之和。如果没有插值,你会得到一些非常不直观的东西,这些东西更难以理解,而且它也没那么有意义和有用(说白的下面那张图是不进行插值,没有就设为0得到的):
在这里插入图片描述

目前,OpenTSDB主要支持线性插值(有时缩短为“lerp”)以及一些简单地替换零或最大值或最小值的聚合器。对于想要添加其他插值方法的人,欢迎使用补丁。

只会在查询时执行插值。许多系统在写入时进行插值,因此会记录非原始值。OpenTSDB存储您的原始值,并允许您随时检索它(即OpenTSDB的插值不会被落库)。

以下是来自邮件列表的另一个稍微复杂的示例,描述了如何按平均值聚合多个时间序列:
在这里插入图片描述

带有三角形的粗蓝线是根据查询具有多个时间序列函数值聚合而成的,而聚合的方式是对与丢失的值视为0,从而得到蓝色所在的图(好像没啥意义)

注意:聚合函数根据输入数据点的类型决定返回整数还是double 值。如果两个源值都是存储中的整数,则生成的计算将为整数。这意味着计算产生的任何小数值都将被删除,不会发生舍入。如果任一数据点是浮点值,则结果将是浮点。但是,如果启用了下采样或速率,则结果将始终为浮点数。

OpenTSDB旨在在查询执行期间有效地组合多个不同的时间序列。这样做的原因是,当用户查看他们的数据时,他们通常会从较高的级别开始询问诸如“数据中心的总吞吐量是多少?”之类的问题。或“按地区划分的当前用功耗是多少?”。在查看这些高级别值之后,可能会出现一个或多个值,因此用户可以深入研究更详细的数据集,例如“我的LAX数据中心主机的吞吐量是多少?”。我们希望能够轻松回答这些高级问题,但仍然可以深入了解更多细节。 但是,如何将多个单独的时间序列合并为一个系列的数据呢?聚合函数提供了将不同时间序列数学方式将不同时间序列合并为一个的方法。过滤器用于按标签对结果进行分组,然后将聚合应用于每个组。聚合类似于SQL的GROUP BY子句,其中用户选择预定义的聚合函数以将多个记录合并为单个结果。但是在TSD中,每个时间戳和组聚合一组记录。 每个聚合器都有两个组件: 功能 - 应用的数学计算,例如对所有值求和,计算平均值或选择最高值。 插值 - 一种处理缺失值的方法,例如当时间序列A的值为T1但时间序列B没有值时。 本文档重点介绍如何在一个组中按上下文使用聚合器,即将多个时间序列合并为一个时。此外,聚合器可用于下采样时间序列(即返回较低分辨率的结果集)。有关更多信息,请参阅下采样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值