openGauss数据库源码解析系列文章—— AI技术之“指标采集、预测与异常检测”_opengauss transformoperatorplus解析(2)

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

def forecast_metric(name, train_ts, save_path=None):
    …
        forecast_alg.fit(timeseries=train_ts)
        dates, values = forecast_alg.forecast(
            period=TimeString(args.forecast_periods).standard)
    date_range = "{start_date}~{end_date}".format(start_date=dates[0],
                                           end_date=dates[-1])
    display_table.add_row(
        [name, date_range, min(values), max(values), sum(values) / len(values)]
    )

校验存储路径

    if save_path:
        if not os.path.exists(os.path.dirname(save_path)):
            os.makedirs(os.path.dirname(save_path))
        with open(save_path, mode='w') as f:
            for date, value in zip(dates, values):
                f.write(date + ',' + str(value) + '\n')
# 从本地sqlite中抽取需要的数据
with sqlite_storage.SQLiteStorage(database_path) as db:
    if args.metric_name:
        timeseries = db.get_timeseries(table=args.metric_name, period=max_rows)
        forecast_metric(args.metric_name, timeseries, args.save_path)
    else:

获取sqlite中所有的表名

        tables = db.get_all_tables()
        # 从每个表中抽取训练数据进行预测

for table in tables:
timeseries = db.get_timeseries(table=table, period=max_rows)
forecast_metric(table, timeseries)

输出结果

print(display_table.get_string())

代码远程部署

def deploy(args):
print('Please input the password of {user}@{host}: '.format(user=args.user, host=args.host))

格式化代码远程部署指令

command = 'sh start.sh --deploy {host} {user} {project_path}' \
    .format(user=args.user,
            host=args.host,
            project_path=args.project_path)
# 判断指令执行情况

if subprocess.call(shlex.split(command), cwd=SBIN_PATH) == 0:
print(“\nExecute successfully.”)
else:
print(“\nExecute unsuccessfully.”)

展示当前监控的参数

def show_metrics():

项目总入口

def main():


#### 2. 关键代码段解析


(1) 后台线程的实现。  
 前面已经介绍过了,本功能可以分为三个角色:Agent、Monitor以及Detector,这三个不同的角色都是常驻后台的进程,各自执行着不同的任务。Daemon类就是负责运行不同业务流程的容器类,下面介绍该类的实现。



class Daemon:
“”"
This class implements the function of running a process in the background.“”"

def __init__(self):
    …

def daemon_process(self):
# 注册退出函数
atexit.register(lambda: os.remove(self.pid_file))
signal.signal(signal.SIGTERM, handle_sigterm)

启动进程

@staticmethod
def start(self):
    try:
        self.daemon_process()
    except RuntimeError as msg:
        abnormal_exit(msg)

    self.function(*self.args, **self.kwargs)
# 停止进程
def stop(self):
    if not os.path.exists(self.pid_file):
        abnormal_exit("Process not running.")

    read_pid = read_pid_file(self.pid_file)
    if read_pid > 0:
        os.kill(read_pid, signal.SIGTERM)
    if read_pid_file(self.pid_file) < 0:
        os.remove(self.pid_file)

(2) 数据库相关指标采集过程。  
 数据库的指标采集架构,参考了Apache Flume的设计。将一个完整的信息采集流程拆分为三个部分,分别是Source、Channel以及Sink。上述三个部分被抽象为三个不同的基类,由此可以派生出不同的采集数据源、缓存管道以及数据的接收端。  
 前文提到过的DBSource即派生自Source、MemoryChannel派生自Channel,HttpSink则派生自Sink。下面这段代码来自metric\_agent.py,负责采集指标,在这里将上述模块串联起来了。



def agent_main():

# 初始化通道管理器
cm = ChannelManager()

初始化数据源

source = DBSource()
http_sink = HttpSink(interval=params['sink_timer_interval'], url=url, context=context)
source.channel_manager = cm
http_sink.channel_manager = cm
# 获取参数文件里面的功能函数
for task_name, task_func in get_funcs(metric_task):
    source.add_task(name=task_name,
                    interval=params['source_timer_interval'],
                    task=task_func,
                    maxsize=params['channel_capacity'])
source.start()
http_sink.start()

(3) 数据存储与监控部分的实现。  
 Agent将采集到的指标数据发送到Detector服务器上,并由Detector服务器负责存储。Monitor不断对存储的数据进行检查,以便提前发现异常。  
 这里实现了一种通过SQLite进行本地化存储的方式,代码位于sqlite\_storage.py文件中,实现的类为SQLiteStorage,该类实现的主要方法如下:



通过时间戳获取最近一段时间的数据

def select_timeseries_by_timestamp(self, table, period):

通过编号获取最近一段时间的数据

def select_timeseries_by_number(self, table, number):


其中,由于不同指标数据是分表存储的,因此上述参数table也代表了不同指标的名称。  
 异常检测当前主要支持基于时序预测的方法,包括Prophet算法(由Facebook开源的工业级时序预测算法工具)和ARIMA算法,他们分别被封装成类,供Forecaster调用。  
 上述时序检测的算法类都继承了AlgModel类,该类的结构如下:



class AlgModel(object):
“”"
This is the base class for forecasting algorithms.
If we want to use our own forecast algorithm, we should follow some rules.
“”"

def __init__(self):
    pass

@abstractmethod
def fit(self, timeseries):
    pass

@abstractmethod
def forecast(self, period):
    pass

def save(self, model_path):
    pass

def load(self, model_path):
    pass

在Forecast类中,通过调用fit()方法,即可根据历史时序数据进行训练,通过forecast()方法预测未来走势。  
 获取到未来走势后如何判断是否是异常呢?方法比较多,最简单也是最基础的方法是通过阈值来进行判断,在我们的程序中,默认也是采用该方法进行判断的。


### 8.5.4 使用示例


Anomaly-Detection工具有start、stop、forecast、show\_metrics、deploy五种运行模式,各模式说明如表8-12所示。



 表8-12 Anomaly-Detection使用模式及说明 




|  |  |
| --- | --- |
| 模式名称 | 说明 |
| start | 启动本地或者远程服务 |
| stop | 停止本地或远程服务 |
| forecast | 预测指标未来变化 |
| show\_metrics | 输出当前监控的参数 |
| deploy | 远程部署代码 |


Anomaly-Detection工具运行模式使用示例如下所示。  
 ① 使用start模式启动本地collector服务,代码如下:



python main.py start –role collector


② 使用stop模式停止本地collector服务,代码如下:



python main.py stop –role collector


③ 使用start模式启动远程collector服务,代码如下:



python main.py start --user xxx --host xxx.xxx.xxx.xxx –project-path xxx –role collector


④ 使用stop模式停止远程collector服务,代码如下:



python main.py stop --user xxx --host xxx.xxx.xxx.xxx –project-path xxx –role collector


⑤ 显示当前所有的监控参数,代码如下:



python main.py show_metrics


⑥ 预测io\_read未来60秒的最大值、最小值和平均值,代码如下:


现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。



分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

![](https://img-blog.csdnimg.cn/img_convert/21b2604bd33c4b6713f686ddd3fe5aff.png)



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值