【FCon上海】与行业领袖共话AI大模型、数字化风控等前沿技术。 了解详情
写点什么

深入浅出时序数据库之分布式计算

  • 2017-07-27
  • 本文字数:2878 字

    阅读完需:约 9 分钟

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

物联网领域近期如火如荼,互联网和传统公司争相布局物联网。作为物联网领域数据存储的首选,时序数据库也越来越多进入人们的视野,而早在 2016 年 7 月,百度云在其天工物联网平台上发布了国内首个多租户的分布式时序数据库产品 TSDB,成为支持其发展制造,交通,能源,智慧城市等产业领域的核心产品,同时也成为百度战略发展产业物联网的标志性事件。

前文提到数据查询特别是大数据量的聚合分析查询是时序数据库需要解决的一个主要问题,之前的文章介绍了通过预处理数据的方法,用空间换时间的思路,降低了大数据量聚合分析的延时。

本文将从分布式计算方向思考,从并发的角度介绍时序数据库如何降低数据查询的延时。

1. 单机时序数据的聚合计算

我们先来看看单机是如何支持单聚合函数的计算。单机聚合计算非常简单,用户查询数据时,计算节点查询获取时间范围内的所有时序数据,节点按照时序使用聚合函数对数据进行计算,生成计算结果。

分析查询也经常会使用嵌套聚合,嵌套聚合函数使用不同的时间窗口,内部函数通常使用小时间窗口,外部使用更大的时间窗口。那嵌套聚合查询在单机如何计算呢?和单一聚合函数类似,嵌套聚合函数的计算是在内部聚合函数计算的结果之上,根据时间再次计算,获取结果。如下图查询月平均气温最低的一周以及平均气温。总体来说,单机时序数据的嵌套和非嵌套聚合函数的实现过程简单直接,很容易理解。

(点击放大图像)

单机计算有什么特征呢?从单机的计算过程,我们可以看到单机需要查询获取所有原始时序数据,原始数据查询的IO 成本和计算成本非常高,整个查询的延时会很高,但是聚合运算后的结果往往数据量很少。

2. 分布式聚合计算

分布式计算是一种计算方法,与之相对的是集中式计算,是通过使用多个计算资源在分布式的环境中并发执行计算的方法。在时序数据库领域,随着数据的增长,时序数据会越来越多,单机的存储、查询和聚合分析 IO 时间成本非常高,虽然使用更加高效的硬件也能够缓解,但是有处理上限,基于成本等因素的考虑,分布式聚合查询仍然是时序数据库自然而然的选择。

当时序数据库存储的数据越来越多时,聚合查询不可避免,这也是 OLAP 分析查询中最常见操作之一,使用预处理可以提高查询性能,但是不够灵活。分布式聚合计算则是能够使用分布式的特性,通过多个计算资源并行计算,再对结果进行合并返回,通过并发提高聚合查询性能。

3. 分布式时序数据聚合计算

时序数据的分布式聚合计算需要多个节点并行计算,逻辑上也是一个 Map/Reduce 的过程,Map 过程需要对原始时序数据进行分片,分别聚合计算。Reduce 过程则是对多个分片计算结果的合并。往往聚合运算的结果和原始数据有着明显数据量的差距,其次分布式计算可以更多的考虑数据的本地化,因此使用分布式聚合计算显然能够有效提高查询性能。

时序数据要进行分布式计算需要解决两个基本问题:时序数据计算分片以及计算结果的合并。

3.1 时序数据计算分片

时序数据聚合计算的分片可以分为几个维度考虑:存储分片、聚合函数时间窗口以及查询条件。

首先,时序数据聚合查询包含多种条件,对时序数据进行分组聚合查询也是一种常用查询,不同的分组原始时序数据不同,因此可以通过查询分组对时序数据计算进行分片,不同的分组使用不同节点并发计算。

其次,时序数据聚合查询函数通常都包含时间窗口,相同时间窗口的原始数据聚合计算为一个数据点,不同的时间窗口用于计算的时序原始数据不同,因此也同样可以通过时间窗口对时序数据计算进行时间维度的分片,不同的节点计算不同时间窗口的数据。

第三,按照存储分片进行计算。我们先来回忆一下前文说描述的时序数据的存储,时序数据由于存储的数据量很大,单机并不能满足需求,因此需要对时序数据进行分片存储,分片 (shard) 通常使用 metric+tags 的方式进行,不同的分片存储在不同的存储节点,分片存储着原始时序数据,使用存储分片进行分片计算,也是一种自然而然的选择。如下图先对 shard 进行分片计算查询,最后对结果进行合并。

(点击放大图像)

使用存储分片来分片计算有着什么优势呢?显然,数据查询和计算在存储分片的节点上进行,能够最大的保证数据本地化,能够有效减少网络通讯带来的延时,使得本地数据计算更加高效。

分布式聚合查询在实现时,往往多种计算分片方式同时使用,聚合计算尽量保证本地化、 尽量多的并发执行。

3.2 时序数据计算结果的合并

时序数据聚合计算结果的合并和计算分片的方式有相关性,不同分片方式结果的合并方式也不同。

首先,对于分组聚合查询结果的合并来说,不同的分组查询结果属于不同的分组,按照分组聚合查询条件合并结果,就能形成计算结果。

其次,对于聚合函数时间窗口分片查询的合并来说,不同的时间窗口的计算结果虽然属于同一个分组,但是结果在时间是上有序的,因此只需要对分片计算结果按照时序排序合并,就能获取最终计算结果。

第三,对于存储分片进行分片计算结果的合并来说,合并相对复杂,因为在同一个时间窗口内,可能会包含多个分片,多个分片上同一时间窗口需要聚合运算为一个数据点。聚合运算结果的合并就需要分析聚合函数的特性来进行,例如在 A 和 B 两个存储分片的同一时间窗口内 SUM 聚合函数,显然计算结果可以直接累加 SUM(A U B) = SUM(A) + SUM(B),但是并不是所有的聚合函数都满足这一特性,需要根据聚合函数的特性做一一的分类。

当使用多种分片方式进行聚合查询时,相应结果的合并也同样更为复杂。

3.3 时序数据嵌套聚合运算

嵌套聚合查询也是数据分析的常用方式,嵌套聚合运算往往多个聚合函数嵌套而成,每个聚合函数的计算属性并不完全相同。在考虑计算分片时,可以考虑将外部嵌套函数和内部嵌套函数分开计算,选择更加有利的分片方式。例如考虑 DIFF(SUM(A, 1day)) 嵌套聚合函数(DIFF 聚合函数是计算前后时间序列结果的差值),既可以使用按照时间窗口的方式分片计算,也同样可以考虑将 DIFF 的计算和 SUM 的计算拆分开来,先使用存储分片的方式聚合计算 SUM(A, 1day) 的结果,结果合并时计算 DIFF 嵌套聚合函数的结果,存储分片的分布式计算能够充分利用数据本地化的特性,因此使用后者显然更加高效。嵌套聚合函数的数据如何分片计算,需要根据聚合函数特性以及场景具体分析,这仍然是一个需要深入考虑的问题。

3.4 计算任务的调度和优化

时序数据分布式计算除了计算分片和数据合并问题以外,同样需要处理任务调度和 SQL 查询优化的问题,现有的很多开源框架 Spark、Presto、 Mongodb Hive 都有相应的解决方案,这里就不做深入讨论了。

4. 时序数据聚合查询的难题

时序数据分布式聚合计算仍然有很多难题,例如 COUNT(DISTINCT FIELD),这类聚合函数的特点是在计算结果时内部需要保存大量的中间数据用于计算, 需要消耗大量计算和存储资源。虽然很多大数据领域分布式查询引擎等通过算法都尝试做了部分优化,但是仍然未能完全解决所有问题。

5. 总结

在时序数据库大数据量聚合分析查询中,聚合运算直接影响着查询性能,使用分布式计算的方法,能够有效的提高查询性能, 相比较于预处理查询更加的灵活。本文主要从分片以及如何并发的角度做了讨论,但是一些特殊嵌套聚合场景的优化仍旧是需要深入思考课题。

2017-07-27 17:463327

评论

发布
暂无评论
发现更多内容

淘宝的商品中心和类目体系是怎么设计的

邴越

架构 阿里 模型 电商 业务

【春节不远行,云上过大年】来华为云社区,接任务领新年红包啦···

华为云开发者联盟

华为云

开放下载!解锁 Serverless 从入门到实战大“橙”就

阿里巴巴云原生

云计算 Linux Serverless 开发者 云原生

Spring Boot Admin 集成诊断利器 Arthas 实践

阿里巴巴云原生

Java Docker 容器 云原生 Arthas

2021年 区块链最火的app爱打卡

v16629866266

面试加分项!零基础如何成为高级Android开发,先收藏了

欢喜学安卓

android 程序员 面试 移动开发

🌏 超详细 DNS 协议解析

飞天小牛肉

Java 程序员 面试 计算机网络 2月春节不断更

PM必备自我管理工具整理

做人没有梦想和咸鱼有什么区别

项目管理 PM

短信验证码被刷怎么办?java 短信验证码防刷策略分析

香芋味的猫丶

黑客 短信防刷 短信验证码 短信防轰炸 短信防火墙

您的《操作系统线程模型总结》请查收。

后台技术汇

28天写作 2月春节不断更

一周信创舆情观察(1.25~1.31)

统小信uos

《iOS面试简历技巧解析》

ios 面试

基于SpringBoot的微服务架构与K8S容器部署实践

Java 架构 微服务

如何快速上手 angular.js

华为云开发者联盟

html Vue 数据 angular js

民进昆明市委:建议利用区块链技术优势在昆明打造金融应用平台

CECBC

金融 金融区块链

徒手撸一个Spring Boot中的starter

田维常

springboot

今年我读了四个开源项目的源码,来分享下心得

yes

源码 面试 后端

16张图带你吃透Redis架构演进

Kaito

redis 架构 高性能

GrowingIO SaaS 产品 CI/CD 实践 (一)

GrowingIO技术专栏

ci SaaS CD

以终为始:28天打卡输出复盘

熊斌

个人成长 写作平台 28天写作

一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群

刘悦的技术博客

flask k8s kubectl Docker Desktop gunicorn

LeetCode题解:529. 扫雷游戏,DFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

RocketMQ-Spring 毕业两周年,为什么能成为 Spring 生态中最受欢迎的 messaging 实现?

阿里巴巴云原生

Docker 容器 微服务 云原生 API

“新内容 新交互” 阿里云全球视频云创新挑战赛正式开启!

阿里云视频云

阿里云 音视频 应用

OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践

阿里巴巴云原生

人工智能 容器 运维 云原生 k8s

2021全新iOS学习方向

ios 逆向

28天总结

张老蔫

28天写作

区块链+电力,又擦出什么新火花?

CECBC

区块链

互助系统软件开发,互助app开发

luluhulian

面试加分项!我在美团Android研发岗工作的那5年,系列篇

欢喜学安卓

android 程序员 面试 移动开发

原来这就是大厂的MySQL主从复制、读写分离及高可用方案!

MySQL 数据库 架构

深入浅出时序数据库之分布式计算_数据库_百度云时序数据库资深工程师_InfoQ精选文章