KaiwuDB 乱序数据处理功能解读
01 背景一览
在时序数据写入数据库的场景中,由于存在网络延迟等问题,可能会出现需要写入数据的时间戳小于已写入数据的最大时间戳的情况,这类数据统称为乱序数据。乱序数据的产生几乎是不可避免的,同时,乱序数据的写入会影响所有数据的排序和查询,因此,我们需要在支持乱序数据写入的基础上,也能良好地支撑乱序数据高效查询。
02 流程概述
在处理乱序数据时,指定时间窗口内(比如 10 分钟或 1 小时)的乱序数据会根据去重策略处理之后存储下来,时间窗口之外的乱序数据会被丢弃。下图是乱序数据写入的基本流程:
其中,需明确 3 个要点:
- 时间窗口是指表最新数据时间戳的时间点再前置的一段时间,在表没有新数据的写入时,它的时间窗口不会变。
- 配置文件中存在参数:ts_st_iot_disorder_interval,用以支持乱序数据写入的时间窗口,单位:秒。此配置项的值不能超过分区时间间隔数值。
- 数据是否乱序的判断依据为写入数据的时间戳小于等于写入的表对象中存储的所有数据最大时间戳。
03 场景示例
1、正常写入流程
时间分为系统时间和数据时间两条线。数据时间每个表都不相同,因此分为表 1 的数据时间和表 2 数据时间两条线。
-
场景1:顺序写入两天前的数据场景如上图所示,表 1 的顺序写入历史分区 1 的场景,写入的顺序数据会被存储到对应的分区中,历史分区写入失败并抛错。
-
场景2:时间窗口内写入乱序数据如上图所示,表 2 写入时间窗口内的乱序数据,写入的数据会被存储到活动分区 2 中,活动分区 2 正在另一个线程中进行分区压缩,写入操作也会成功。
-
场景3:超出时间窗口的乱序数据写入当数据库开启压缩功能,并且配置乱序时间窗口为 1 小时,写入比表最新记录时间戳早 1 小时以前的乱序数据会失败。写入的数据会被过滤掉,写入到日志中。
2、导入数据流程
导入数据中也会存在有乱序数据的情况,这种场景下对于乱序数据的处理同正常写入流程保持一致。
-
数据本身处理:逐行解析 CSV 文件中的数据,判断第一列数据是不是有效的时间/时间戳类型,如果不是报错返回;如果是有效时间数据,判断数据所属分区,获取分区 bt。如果该数据时间戳大于当前分区中已有数据最大时间戳,直接 pushback;否则需要根据去重配置逻辑处理乱序数据。
-
适配降采样和预计算逻辑:导入的数据过程中需要更新 kaiwudb_jobs 系统任务表中 url 的记录状态为 expired;导入完成后通知预计算/降采样,对涉及的数据重新计算/处理,或者等待下一次预计算任务被系统调度时再重算。
导入结束后,通知预计算和降采样进行重计算或者结果更新,以及更新 lastbt。
3、降采样流程
乱序数据写入之后,降采样结果需要根据最新的数据进行更新。
-
处理导入历史分区的乱序数据:导入归属历史分区的乱序数据时,更新 kaiwudb_jobs 系统任务表中 url=[database/partition/table_name] 的记录状态为 expired,后续会对该分区表重新进行对应降采样规则处理。
-
处理 insert 写入历史分区数据:在对 insert 数据表的历史分区解压时,更新 kaiwudb_jobs 系统任务表中 url=[database/partition/table_name] 的记录状态为 expired,后续样会对该分区表重新进行对应降采样规则的处理。
4、预计算流程 乱序数据写入之后,预计算结果需要根据最新的数据进行更新。
-
处理 insert 写入乱序数据:insert 每出现一条乱序数据就插入一条,这样的做法能更大程度保证预计算结果正确性。
-
处理导入的乱序数据:导入目前按照分区表为单位处理,每个分区表导入过程中记录乱序开始时间戳和结束时间戳,当前分区表导入完成后调用预计算接口进行重算。
04 总结
乱序数据处理的场景中,涉及到的功能及联动模块较多,需要进行同步处理及更新。当数据库具备完善的乱序数据处理后,可更好地适配用户业务场景,大幅提高数据库的多场景适用性。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
从模型到部署,教你如何用Python构建机器学习API服务
本文分享自华为云社区《Python构建机器学习API服务从模型到部署的完整指南》,作者: 柠檬味拥抱。 在当今数据驱动的世界中,机器学习模型在解决各种问题中扮演着重要角色。然而,将这些模型应用到实际问题中并与其他系统集成,往往需要构建API服务。本文将介绍如何使用Python构建机器学习模型的API服务,并提供案例代码作为示例。 1. 确定模型 首先,我们需要选择并训练一个适当的机器学习模型。这可能涉及数据收集、预处理、特征工程和模型训练等步骤。在本文中,我们将以一个简单的示例来说明,假设我们已经有一个训练好的线性回归模型,用于预测房屋价格。 from sklearn.linear_model import LinearRegression import numpy as np # 生成示例数据 X = np.array([[1], [2], [3], [4], [5]]) y = np.array([1, 2, 3, 4, 5]) # 训练线性回归模型 model = LinearRegression() model.fit(X, y) 2. 构建API服务 接...
- 下一篇
Ascend C 自定义PRelu算子
本文分享自华为云社区《Ascend C 自定义PRelu算子》,作者: jackwangcumt。 1 PRelu算子概述 PReLU是 Parametric Rectified Linear Unit的缩写,首次由何凯明团队提出,和LeakyReLU非常类似,是Relu的改进版本,在几乎没有增加额外参数的前提下既可以提升模型的拟合能力,又能减小过拟合风险。PReLU的数学表达式我们可以参考pytorch中PReLU的描述(https://pytorch.org/docs/2.1/generated/torch.nn.PReLU.html#prelu): 2 Ascend C自定义算子 基于Ascend C进行自定义算子开发之前,需要成功基于昇腾设备安装相关的驱动、固件以及开发者套件。我之前安装的开发者套件版本过低,编译运行官方的Sample部分示例会报错,因此,需要重新安装一个8.0新版本,依次用root执行如下命令: # 卸载 cann-toolkit_7.0.RC1 root@atlas500ai:/home/kzroot/mysoft# ./Ascend-cann-toolk...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果