DownSampling向下采样

简述:
     降采样(或在信号处理,抽取中)是降低数据采样率或分辨率的过程。 例如,假设温度传感器每秒钟都向OpenTSDB系统发送数据。 如果用户在一小时内查询数据,他们将获得3,600个数据点,这些数据点可以相当容易地绘制出来。 但是现在,如果用户要求整整一周的数据,他们将获得604,800个数据点,并且突然间图形可能变得非常混乱。 使用下采样器,单个时间序列在一个时间范围内的多个数据点在一个对齐的时间戳中与数学函数一起聚合成单个值。 这样我们可以将数量从604,800减少到168。

向下采样至少需要两个组件:
  •      时间间隔(Interval) - 一个时间范围(或存储桶),用于汇总这些值。 例如,我们可以将多个值汇总1分钟或1小时甚至整整一天。 间隔以<大小> <单位>格式指定,例如1小时1小时或30分钟30分钟。 从2.3开始,所有间隔现在可用于将时间范围内的所有结果缩减为一个值。 例如。 0all-sum将从查询开始到结束总结所有值。 请注意,数值仍然是必需的,但它可以是零或任何其他值。
  • 聚合函数 - 确定如何合并区间中的值的数学函数。 该功能使用Aggregation文档中的聚合函数。
例如,采取以下时间序列A和B.数据点覆盖70秒的时间间隔,每10秒一个值。 假设我们希望缩减到30秒,因为用户正在查看更宽时间跨度的图。 此外,我们使用总和聚合器将这两个系列分组为一个。 我们可以指定一个30s-sum的下采样器,它将创建30秒钟的桶并对每个桶中的所有数据点进行求和。 这将为我们提供每个系列的三个数据点

DownSampling向下采样

正如您所看到的,对于每个时间序列,我们生成一个合成序列,其时间戳标准化为区间边界(每30秒),以便我们在t0,t0 + 30s和t0 + 60s处具有一个值。 每个间隔或存储桶将包含包含存储桶时间戳(开始)的数据点,并且不包括以下存储桶的时间戳(结束)。 在这种情况下,第一个桶将从t0延伸到t0 + 29.9999s。 使用提供的聚合器,将所有值合并为一个新值。 例如。 对于A系列,我们总结t0,t0 + 10s和t0 + 20s的值,以在t0时刻达到20的新值。 最后,查询使用总和进行分组,以便我们添加两个合成时间序列。 此时,OpenTSDB总是在缩减采样后执行分组聚合。


对于早期版本的OpenTSDB,新数据点的实际时间戳将是时间跨度中每个数据点的时间戳的平均值。 从2.1和更高版本开始,每个点的时间戳与基于当前时间和下采样间隔的模的时间桶的开始对齐。

降采样时间戳基于原始数据点时间戳的剩余部分除以下采样间隔(以毫秒为单位),即模数进行归一化。 在Java中,代码是时间戳 - (时间戳记%interval_ms)。 例如,给定1388550980000或2014年1月1日04:36:20的时间戳和小时间隔(相当于3600000毫秒),则生成的时间戳将四舍五入为1388548800000. 4和5 UTC之间的所有数据点将风 在4 AM桶中。 如果您在1小时内查询了一天的数据下采样,您将收到24个数据点(假设所有24小时都有数据)。


使用0all-interval时,结果的时间戳将成为查询的开始时间。

标准化对于常见查询非常有效,例如将一天的数据下采样到1分钟或1小时。 但是,如果您尝试在奇数间隔(如36分钟)下采样,则由于模数计算的性质,时间戳可能看起来有点奇怪。 给定36分钟的时间间隔以及我们上面的示例,时间间隔为2160000毫秒,结果时间戳为1388549520或04:12:00 UTC。 04:12至04:48之间的所有数据点将在单个桶中结束。


从OpenTSDB 2.3开始,用户可以指定基于日历的下采样而不是快速模数方法。 这对于报告目的更为有用,例如查看与人类时代相关的值,例如数月,数周或数天。 此外,下采样可以考虑时区,并纳入夏时制时间偏移和区域偏移。

要使用日历边界,请查看您正在查询的端点的文档。 例如,V2 URI端点具有要使用的特定时区参数,例如&timezone = Asia / Kabul,并通过在间隔时间单位中追加c来启用基于日历的下采样,如&m = sum:1dc-sum:my.metric。 对于JSON查询,在顶层使用单独的时区字段以及useCalendar布尔标志。 如果未提供时区,则日历将使用UTC时间。

通过日历缩减采样,第一个时间间隔在指定时区的查询年份的00:00:00捕捉到1月1日。 从那里开始计算间隔桶直到查询结束。 每个存储桶都标有存储桶开始的时间戳(含),并包含所有值,直到下一个存储桶开始为止。

填充政策:

降采样通常用于调整时间戳,以避免在执行分组时进行插值。 由于OpenTSDB不会对时间对齐或值存在时施加约束,因此必须在查询时指定这些约束。 使用下采样执行分组聚合时,如果所有序列都缺少预期间隔的值,则不会发射任何数据。 例如,如果一系列数据从t0到t0 + 6m每分钟都在写数据,但由于某些原因,源在t0 + 3m时未能写入数据,则当用户期望6时,只有5个值将被序列化。 2.2和更高版本,您现在可以选择为t0 + 3m发射什么值,以便用户(或应用程序)可以看到特定时间戳的值缺失,而不必找出缺少哪个时间戳。 只要下采样桶为空,填充策略就会简单地发出预定义的值。

可用的政策包括:
  • 无(none) - 默认行为,在序列化期间不会发出缺失值,并在聚合系列时执行线性插值(或以其他方式指定的插值)。
  • NaN(nan) - 在串行输出中缺少所有值时发出NaN。 当值丢失时跳过聚合中的系列,而不是将整个组计算转换为NaN。
  • Null(null) - 与NaN相同的行为,除了在序列化期间它会发出null而不是NaN。
  • 零(零) - 当时间戳丢失时替换为零。 零值将被合并到汇总结果中。
要使用填充策略,请将策略名称(括号中的术语)附加到由连字符分隔的缩减采样聚合函数的末尾。 例如。 1h-sum-nan或1m-avg-zero。


DownSampling向下采样

如果我们要求没有填充策略的输出,则不会在t0 + 20s或t0 + 40s发射任何值或时间戳。 另外,
系列B的t0 + 30s和t0 + 50s的值将被线性内插以填入要与系列A相加的值。