使用InfluxDB和半空间树进行异常检测
作者:Anais Dotis-Georgiou / 开发者
2023年11月10日
导航至
任何现有的InfluxDB用户都会注意到,随着InfluxDB 3.0的发布,InfluxDB经历了变革。InfluxDB v3提供了比之前版本高出45倍的写入吞吐量,查询速度比之前版本快5-25倍(更多性能基准测试请参阅这篇帖子)。
InfluxDB的ETL
我们还降低了几个2.x版本中存在的功能的优先级,以专注于与现有工具的互操作性。任务引擎就是InfluxDB v2中存在的被降低优先级的功能之一。虽然任务引擎支持广泛的Flux函数,但它无法与现有的大量提取、转换、加载(ETL)工具竞争,特别是针对数据准备、分析和转换的工具。这些工具中包括Mage.ai。Mage是Airflow的开源替代品。在之前的文章中,我描述了如何使用Mage进行简单的降采样任务。本教程假设你已经阅读了那篇文章,或者对如何使用Mage有基本的了解。在本教程中,我们将学习如何使用Mage进行异常检测并向Slack webhook发送警报。具体来说,我们将生成机器数据,生成异常,并使用半空间树进行检测。
要求
要运行本教程,您需要以下内容
- 一个InfluxDB v3 Cloud账户。
- 一个数据库或存储桶(您从中查询数据并写入数据)。
- 一个允许您读取和写入该数据库的认证令牌。
- 安装Docker以在容器中运行InfluxDB。
- 一个包含以下信息的
.env
文件
bash
export INFLUX_HOST=
export INFLUX_TOKEN=
export INFLUX_ORG=
export INFLUX_DATABASE=
export MAGE_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/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
export MAGE_PROJECT_NAME=influx-magic
export MAGE_ENV=dev
您可以通过以下快速入门指南了解更多关于如何使用Mage的信息。要复制本教程中的示例,克隆此存储库,切换到该目录,并运行以下命令
- 源
env
文件:bash source .env
- 构建镜像:
bash docker compose build
- 启动它们:
bash docker compose up -d magic
注意:本教程使用InfluxData Slack webhook #notifications-testing通道。请加入以发送和接收通知,或者将env文件替换为您选择的Slack webhook。
数据集
对于本例,我们将生成机器数据。具体来说,是三个机器(machine1、machine2和machine3)的负载、振动、电源和温度数据。要创建异常,请导航到localhost:5005
,并点击一个机器以切换异常创建。生成数据的代码来自这个项目,展示了如何使用Arrow、Docker和名为Anomaly Detection Tool Kit (ADTK)的分析库构建简单的任务引擎。它使用Mosquitto和Telegraf将MQTT数据写入InfluxDB Cloud v3。
这是从InfluxDB v3 Cloud UI中的数据探索器看到的正常机器数据的一个示例。
Mage管道
管道包含四个块
- Load_influx_data
- 使用InfluxDB v3 Python客户端查询机器数据,并返回Pandas DataFrame。
- Transform_data
- 在DataFrame中创建一个新的列
unique_id
。对于DataFrame中的每一行,它通过将提供者slugify并追加机器ID后跟破折号来构造一个唯一的ID。 - 更改时间戳的datetime格式。
- 在DataFrame中创建一个新的列
- Detect_anomalies
- 初始化一个新的DataFrame。
- 循环遍历唯一ID:对于在输入DataFrame的
unique_id
列中存在的每个唯一ID(uid),函数将继续进行异常检测。 - 模型创建:此模型采用半空间树方法,这是一种在线异常检测方法。
- 准备数据。
- 遍历行并检测异常。
- 合并结果。
- 返回结果。
- Check_anomalies
- 遍历唯一标识符。
- 根据唯一标识符过滤数据。
- 检查异常。
- 准备绘图数据。
- 绘制数据。
模型选择:半空间树
本例使用半空间树来检测异常。半空间树(HST)是一种用于高维数据异常检测的机器学习算法。它特别适用于处理异常预期占据高维空间中特定区域或子空间的 数据。HST是隔离森林方法的一种,通过将特征空间划分为区域并隔离异常到更小的分区来实现。
以下是半空间树如何检测异常的原理
- 数据在特征空间中使用超平面进行分区。超平面是随机生成的。
- 添加额外的平面以递归地分割数据集并对其进行分区,直到分区中点的数量达到最小阈值。每个额外的平面在树中创建一个节点。
- 点在树中的深度定义了异常。或者它们是否存在于更小的分区中。
最后的想法
对于这个教程,我们每次运行管道时都会导入所有客户端和模型。然而,如果您正在寻找要加载的重量级模型,每次运行管道时都不想这样做。我鼓励您利用条件块。条件块或“附加块”是与另一个块关联的块。管道在执行父块之前评估条件,这决定了父块是否执行。您可以使用它们来实例化转换块的一部分(在那里您执行异常检测),但不必每次都运行它。
InfluxDB是管理时序数据的高效解决方案。它建立在Apache生态系统之上,利用DataFusion、Arrow和Parquet等技术来优化数据写入、存储和查询。此外,它与其他各种工具兼容,允许您利用它们满足特定的ETL和机器学习需求。此外,Mage利用基于Apache Arrow和Parquet的Polars。通过结合这些技术,您可以在时序数据上执行高级ETL操作。
在这里开始使用InfluxDB Cloud 3.0。如果您需要任何帮助,请使用我们的社区网站或Slack频道联系。我很乐意了解您想实现什么以及您希望InfluxDB具有哪些功能。