摘要: 随着云计算和IoT的发展,时间序列数据的数据量急剧膨胀,高效的分析时间序列数据,使之产生业务价值成为一个热门话题。阿里巴巴数据库事业部的HiTSDB团队为您分享时间序列数据的计算分析的通常方法以及优化手段。算法
演讲嘉宾简介:钟宇(悠你) 阿里巴巴 数据库高级专家,时间序列数据库HiTSDB的研发负责人。在数据库、操做系统、函数式编程等方面有丰富的经验。数据库
本次直播视频精彩回顾,戳这里!编程
本次直播视频PPT,戳这里!缓存
本次分享主要分为如下几个方面:服务器
ä¸ã时序数据库的应用场景架构
时序数据就是在时间上分布的一系列数值。生活中常见的时序数据包括,股票价格、广告数据、气温变化、网站的PV/UV、我的健康数据、工业传感器数据、服务器系统监控数据(好比CPU和内存占用率)、车联网等。分布式
下面介绍IoT领域中的时间序列数据案例。IoT给时序数据处理带来了很大的挑战。这是因为IoT领域带来了海量的时间序列数据:ide
IoT中的时间序列数据处理主要包括如下四步:函数式编程
äºã面向分析的时序数据存储函数
下面介绍时间序列数据的一个例子。这是一个新能源风力发电机的例子。每一个风力发电机上有两个传感器,一个是功率,一个是风速,并定时进行采样。三个设备,一共会产生六个时间序列。每一个发电机都有多种标签,这就会产生多个数据维度。好比,基于生产厂商这个维度,对功率作聚合。或基于风场,对风速作聚合等。如今的时序数据库底层存储通常用的是单值模型。由于多值模型也能够一对一的映射到单值模型,但这个过程可能会致使性能损失。可是,在对外提供服务时,单值模型和多值模型都有应用。好比,OpenTSDB就是用单值模型对外提供服务的,而influxDB则是多值模型。但这两种数据库的底层存储用的都是单值模型。
现实中的应用案例事实上会更复杂。像风力发电机这样的案例,它的设备和传感器的数量,咱们能够认为是稳中有增的,不会发生特别剧烈的改变。它的数据采样的周期也是严格的按期采样。下图是一个工业案例,以滴滴这样的运营商为例。因为其业务特性,其车辆数量的增加和降低会出现暴涨暴跌。
整体而言,现实世界的复杂之处在于:
下图是过去提出利用HiTSDB对时序问题的解决方案。在这种方案中,未解决发散问题,较高维数据和值过滤问题。用倒排索引来存储设备信息,并把时间点上的数据存在高压缩比缓存中。这二者结合,实际上将逻辑上的一个表分红了两个表,用以解决多维度查询和聚合的问题。但使用这种方案依然有不少问题没法解决。
下面是HiTSDB的一些优点和不足:
1.优点:
2.不足:
在此基础上,进行了演进,以下图。
ä¸ã时序数据库的时序算法
上面所述的存储结构主要是为了方便进行时序数据的加工和分析。时序有一些特殊算法。
1.降采样和插值:传感器采样出的点可能特别密集,在分析趋势时,会但愿进行过滤。经过降采样能够利用一段时间内的最小值/最大值/平均值来替代。
2.聚合计算:因为采样是精确到每一个传感器的,但有时须要的数据并不只是精确到某个传感器的。好比,但愿比较两个不一样厂商的发电机,哪一个在风场中产生了更多的电。那么就须要对传感器数据进行聚合。
3.时间轴计算
对时序数据进行加工的分析的重要目的是发现异常。下面介绍在异常检测中如何定义问题。从异常检测的角度来看时间序列数据,分为三个维度:time, object, metric。
1.固定两个维度,只考虑一个维度的数据。
2.固定一个维度,只考虑两个维度的数据。
在异常检测中,面向问题有以下计算方法:
·高压缩比缓存直接做为窗口缓存
·对于知足数据局部性的问题,直接在高压缩比缓存上运行
·结果直接写回
·定时调度 vs 数据触发
·定时查询 vs 流式读取
·使用一样的查询语言执行查询或定义数据源
·数据库内置时间窗口
·数据流的触发机制
针对时序数据,又能够将计算分为预计算和后计算。
f2ffb2fe6da6aa136b998b1070467b035da67cca
预计算:事先将结果计算完并存储。这是流计算中经常使用的方式。其特色以下:
·数据存储量低
·查询性能高
·须要手工编写计算过程
·新的计算没法当即查看结果
·灵活性差
·不保存原始数据
后计算:先存数据,须要时进行计算。这是数据库中经常使用的方式。其特色以下:
·数据存储量大
·查询/聚合性能瓶颈
·任何查询均可以随时得到结果
·使用DSL进行查询
·灵活性好
·保存原始数据
基于两种计算的特色,在时序数据处理中,咱们使用的是一种混合架构。有数据进来时,有预聚合规则,若是符合规则就进行预聚合,把数据写入数据库中。在查询时,若是符合预聚合规则,就能够很快获得结果。对于不知足预聚合规则的数据,会将其从数据库中读出,进行后聚合。中间的聚合引擎是一种相似流式计算的架构,数据库或者数据源均可以做为数据源。数据源的来源对于引擎是不可见的,它的功能是接收数据,计算并产生结果。所以,预计算和后计算均可以利用这一种逻辑进行,并放在同一个运行环境中。
在逻辑上,上图是可行的。但实际上,若是要用这种方式进行流计算,因为数据源可能出现乱序等问题,就必需要利用窗口函数,将数据放入时间窗口中整理好,但这种缓存的效率其实并不高,实际状况下,是按照下图这种逻辑进行的。数据会被写进数据库,因为数据库有高压缩比缓存,是专门针对时序数据的。当一个时间窗口结束时,利用持续查询来进行预计算。它会将高压缩比缓存中的数据拿一部分出来作预聚合再写回数据库中。这样,这个缓存机制就替代了原来的时间窗口,节省了不少内存,下降了不少计算开销。
使用相似于流的架构的好处是能够将其很快的接入异构计算的环境中。正如你们熟知的,流计算能够转化为一个DAG。结合前面提到的降采样和聚合的例子。以一个加法为例,能够把数据切成三片放入不一样的工做节点上计算,计算完后再进行一次聚合输出数据。工做节点既多是CPU也多是GPU。接入异构计算的环境中,能够加速数据的计算。
下图是对将来架构的展望。
1.存储层
2.计算层
3.索引
4.大数据
将来,这个数据库将会演化成时序数据平台。它能够兼容SQL生态,一系列大数据平台,以及融合边缘计算。在部署时能够在云和边缘部署一整套的管理架构,同时把用SQL描述的规则下放到云板和边缘板上,造成一整套数据处理方案。
本文由云栖志愿小组马JY整理
本文做者:斑马不睡觉
原文连接本文为云栖社区原创内容,未经容许不得转载。