征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析

outside_default.png

2022年8月4日至9月9日,墨天轮社区联合云和恩墨发起了首届「MogDB 主题征文活动」,邀请各位技术从业者学习、使用 MogDB 数据库,分享使用心得与实战案例,一起探索这款融合了众多创新特性的商业版企业级数据库。活动期间共有93篇稿件通过评审,主题涵盖数据库安装部署、主从搭建、工具测试、源码解析、新特性解读,以及备份恢复、迁移实践等,并由专家评选出一等奖1名、二等奖3名、三等奖5名。本篇是二等奖获得者梅仕吉的文章。

一、概述

趋势预测功能模块主要实现基于历史时序数据预测未来时序变化趋势。该模块框架解耦,可以实现不同预测算法的灵活替换,并且该模块功能可以实现不同特征时序的算法自动选择,支持线性特征时序预测 LR 回归算法和非线性特征预测 ARIMA 算法。目前该模块可以覆盖线性时序、非线性时序和周期时序的准确预测。
dbmind 的趋势预测模块是一个作为监控服务中的一个定时任务定时执行的。

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第1张图片

模块数据流图

outside_default.png

outside_default.png

二、参数配置和建表

它的主要参数配置是在misc/dbmind.config中:

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第2张图片

TSDB:prometheus时序数据库的连接配置;

METADATABASE:保存预测结果的元数据库的配置,支持SQLite,MogDB/openGauss,PostgreSQL;

forecasting_future_time:时序预测的长度,同时也是预测功能调度周期;

golden_kpi:待时序预测进行预测的关键指标项。

保存数据库预测结果的数据库表结构(metadatabase/schema/forecasting_metrics.py)如下(需要在数据库中创建该表):

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第3张图片

1:表名      2:字段名     3:索引

在misc/metric_value_range.conf配置文件中对指标的值进行过滤,限制值范围:

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第4张图片

outside_default.png

outside_default.png

三、定时任务调用代码

模块的调用入口在:app/timed_app.py中:

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第5张图片

1:定时任务多久启动一次。它是由dbmind.conf配置文件中的forecasting_future_time(秒)参数转换为分钟而来的,定位任务的单位是秒,所以乘60;

2:需要的历史训练数据的长度;

3:首先通过从数据访问接口层DAI获取prometheus采集的指定指标的数据,第一个参数是指标名称,第二个是需要的距离当前时间多久的历史数据,第三个指标是对采集的数据做时间上的聚合。300就是没隔300秒采集一次(自己重构的方法,源代码中该方法没有该参数,prometheus采集间隔短);

4:并发执行时序预测。quickly_forecast_wrapper是封装时序预测的一个方法,下面会详细介绍;

5:预测后结果数据存储到源数据库中。
app/timed_app.py中quickly_forecast_wrapper函数解析:

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第6张图片

1:quickly_forecast是趋势预测的核心方法;

2:得到metric_value_range.conf中的值范围;

3:值范围过滤。

outside_default.png

outside_default.png

四、算法核心代码

核心预测方法在tools /common /algorithm /forecasting /forcasting_algorithm.py中:

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第7张图片

1:预测步长:预测的时长除以采集的间隔;

2:对原始数据做插值填补缺失值;

3:时序分解;

4:找到合适的算法并返回模型;

5:对趋势分量进行训练和预测;

6:合并时序,得到最终的预测结果。
详细来看一下第3步的时序分解:

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第8张图片

1:判断是否是周期性数据,ACF+波峰+人为设定的峰的阈值来判断是否是周期数据。(效果不会很一般,有很大的改进空间,可以参考一下auto periods 和阿里的robust periods,再加入先验的搜索空间,比如小时、天、星期、月等);

2:时序分解,用的STL分解;

3:如果数据是非周期数据,直接把原始数据当做趋势分量建模。
详细来看一下第4步的建模部分:

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第9张图片

1:评估模型适合用什么模型(下面会详细介绍怎么评估);

2:根据上面选出来的algorithm_name选择线性回归或ARIMA建模。
上面的estimate_order_of_model_parameters()如何选择模型?

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第10张图片

1:默认选择线性回归模;

2:网格调参寻找ARIMA模型最佳的最优参数组合;

3:BIC评估是否是ARIMA的最优参数p和q。

以上就是趋势预测模块的核心代码的详细介绍。

outside_default.png

outside_default.png

往期回顾

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第11张图片

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第12张图片

数据驱动,成就未来,云和恩墨,不负所托!


云和恩墨创立于2011年,以“数据驱动,成就未来”为使命,是智能的数据技术提供商。我们致力于将数据技术带给每个行业、每个组织、每个人,构建数据驱动的智能未来。

云和恩墨在数据承载(分布式存储、数据持续保护)、管理(数据库软件、数据库云管平台、数据技术服务)、加工(应用开发质量管控、数据模型管控、数字化转型咨询)和应用(数据服务化管理平台、数据智能、隐私计算数据联邦平台)等领域为各个组织提供可信赖的产品、服务和解决方案,围绕用户需求,持续为客户创造价值,激发数据潜能,为成就未来敏捷高效的数字世界而不懈努力。

征文连载丨MogDB / openGauss 中 dbmind 趋势预测模块的源码解析_第13张图片

你可能感兴趣的:(数据库,算法,大数据,python,java)