使用InfluxDB和半空间树进行异常检测

导航至

任何现有的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的信息。要复制本教程中的示例,克隆此存储库,切换到该目录,并运行以下命令

  1. env文件:bash source .env
  2. 构建镜像:bash docker compose build
  3. 启动它们: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和TelegrafMQTT数据写入InfluxDB Cloud v3。

mage hst 这是从InfluxDB v3 Cloud UI中的数据探索器看到的正常机器数据的一个示例。

Mage管道

管道包含四个块

  • Load_influx_data
    • 使用InfluxDB v3 Python客户端查询机器数据,并返回Pandas DataFrame。
  • Transform_data
    • 在DataFrame中创建一个新的列unique_id。对于DataFrame中的每一行,它通过将提供者slugify并追加机器ID后跟破折号来构造一个唯一的ID。
    • 更改时间戳的datetime格式。
  • Detect_anomalies
    • 初始化一个新的DataFrame。
    • 循环遍历唯一ID:对于在输入DataFrame的unique_id列中存在的每个唯一ID(uid),函数将继续进行异常检测。
    • 模型创建:此模型采用半空间树方法,这是一种在线异常检测方法。
    • 准备数据。
    • 遍历行并检测异常。
    • 合并结果。
    • 返回结果。
  • Check_anomalies
    • 遍历唯一标识符。
    • 根据唯一标识符过滤数据。
    • 检查异常。
    • 准备绘图数据。
    • 绘制数据。

模型选择:半空间树

本例使用半空间树来检测异常。半空间树(HST)是一种用于高维数据异常检测的机器学习算法。它特别适用于处理异常预期占据高维空间中特定区域或子空间的 数据。HST是隔离森林方法的一种,通过将特征空间划分为区域并隔离异常到更小的分区来实现。

以下是半空间树如何检测异常的原理

  1. 数据在特征空间中使用超平面进行分区。超平面是随机生成的。
  2. 添加额外的平面以递归地分割数据集并对其进行分区,直到分区中点的数量达到最小阈值。每个额外的平面在树中创建一个节点。
  3. 点在树中的深度定义了异常。或者它们是否存在于更小的分区中。

最后的想法

对于这个教程,我们每次运行管道时都会导入所有客户端和模型。然而,如果您正在寻找要加载的重量级模型,每次运行管道时都不想这样做。我鼓励您利用条件块。条件块或“附加块”是与另一个块关联的块。管道在执行父块之前评估条件,这决定了父块是否执行。您可以使用它们来实例化转换块的一部分(在那里您执行异常检测),但不必每次都运行它。

InfluxDB是管理时序数据的高效解决方案。它建立在Apache生态系统之上,利用DataFusionArrowParquet等技术来优化数据写入、存储和查询。此外,它与其他各种工具兼容,允许您利用它们满足特定的ETL和机器学习需求。此外,Mage利用基于Apache Arrow和Parquet的Polars。通过结合这些技术,您可以在时序数据上执行高级ETL操作。

在这里开始使用InfluxDB Cloud 3.0。如果您需要任何帮助,请使用我们的社区网站Slack频道联系。我很乐意了解您想实现什么以及您希望InfluxDB具有哪些功能。