运行异常检测作业

编辑

异常检测作业包含执行机器学习分析所需的配置信息和元数据。它们可以针对特定时间段运行,也可以针对传入数据持续运行。

设置环境

编辑

在使用 Elastic Stack 机器学习功能之前,需要解决一些配置要求(例如安全权限)。请参阅 设置和安全性

如果您的数据位于 Elasticsearch 外部,则无法使用 Kibana 创建作业,并且无法使用数据源实时检索数据。直接向异常检测作业发布数据已弃用,在未来的主要版本中将需要数据源。

创建异常检测作业

编辑

您可以使用 创建异常检测作业 API 创建异常检测作业。Kibana 还提供了向导来简化此过程,这些向导会根据您使用的是机器学习应用程序、Elastic Security 应用程序还是可观测性应用程序而有所不同。在 机器学习 > 异常检测

Create New Job
  • 单度量向导创建具有单个检测器的简单作业。检测器 对数据中的特定字段应用分析函数。除了限制检测器的数量外,单度量向导还省略了许多更高级的配置选项。
  • 多度量向导创建可以具有多个检测器的作业,这比针对相同数据运行多个作业更有效。
  • 群体向导创建用于检测与群体行为相比不寻常的活动的作业。
  • 分类向导创建将日志消息分组到类别中并使用 countrare 函数来检测其中的异常的作业。
  • 高级向导创建可以具有多个检测器并允许您配置所有作业设置的作业。

Kibana 还可以识别某些类型的数据并为该上下文提供专门的向导。例如,有用于示例电子商务订单和示例 Web 日志数据集的异常检测作业,以及用于 Elastic Security 和可观测性解决方案、Beats 和 Elastic Agent 集成生成的数据的异常检测作业。有关所有预配置作业的列表,请参阅 提供的配置

当您在 Kibana 中创建异常检测作业时,作业创建向导可以根据数据的特征提供建议。通过听取这些建议,您可以创建更可能产生有见地的机器学习结果的作业。此处介绍了最重要的概念;有关所有作业属性的说明,请参阅 创建异常检测作业 API

桶跨度
编辑

机器学习功能使用的概念将时间序列划分为批次进行处理。

桶跨度是异常检测作业的配置信息的一部分。它定义了用于汇总和建模数据的时间间隔。这通常在 5 分钟到 1 小时之间,具体取决于您的数据特征。设置桶跨度时,请考虑要分析的粒度、输入数据的频率、异常的典型持续时间以及需要发出警报的频率。

桶跨度必须包含有效的 时间间隔。当您在 Kibana 中创建异常检测作业时,可以选择根据您的数据特征估算桶跨度值。如果您选择的值大于一天或与估计值有很大差异,您将收到一条信息性消息。

检测器
编辑

每个异常检测作业必须有一个或多个检测器。检测器定义将发生的分析类型以及要分析的字段。

检测器还可以包含影响哪些类型的实体或事件被视为异常的属性。例如,您可以指定实体是相对于它们之前的行为进行分析,还是相对于群体中的其他实体进行分析。还有多个选项可以将数据拆分为类别和分区。

如果您的作业不包含检测器或检测器不包含 有效函数,您将收到错误。如果作业包含重复的检测器,您也会收到错误。如果检测器具有相同的 functionfield_nameby_field_nameover_field_namepartition_field_name,则检测器是重复的。

影响因素
编辑

当发生异常事件时,我们想知道原因。但是,要确定原因,您通常需要更广泛的领域知识。如果您怀疑数据集中哪些实体可能导致不规则性,您可以将它们标识为异常检测作业中的影响因素。也就是说,影响因素是您怀疑包含有关影响或导致数据中异常的人或事物的信息的字段。影响因素可以是数据中的任何字段。

您可以使用 高级作业向导 创建异常检测作业时选择影响因素。

使用机器学习 API 选择影响因素时的要求
  • 影响因素字段必须存在于您的数据源查询或聚合中;否则,它不会包含在作业分析中。
  • 如果您在数据源中使用查询:影响因素字段必须与检测器字段在同一命中中存在于查询结果中。数据源通过分页浏览查询结果来处理数据;由于搜索命中不能跨多个索引或文档,因此数据源具有相同的限制。
  • 如果您在数据源中使用聚合,则可以使用来自与检测器字段不同的索引的影响因素。但是,两个索引都必须具有具有相同名称的日期字段,您可以在数据源的 data_description.time_field 属性中指定该字段。
  • 影响因素不需要是您的异常检测作业检测器中指定的字段,尽管它们通常是。

强烈建议选择影响因素,原因如下

  • 它使您可以更轻松地为异常分配责任。
  • 它简化并聚合了结果。

如果您使用 Kibana,作业创建向导可以建议要用作影响因素的字段。最好的影响因素是您要归咎于异常的人或事物。在许多情况下,类别数据字段(如用户或客户端 IP 地址)是很好的影响因素。

Kibana 中的 异常资源管理器 列出了作业的顶级影响因素,并显示了每个异常的最具影响力的值。它还允许您按给定的影响因素过滤数据。

不要选择太多影响因素。例如,您通常不需要超过三个。如果您选择很多影响因素,结果可能会让人不知所措,并且分析会产生少量开销。

有关影响因素的更多详细信息,请参阅 此博客文章

基数
编辑

如果您的数据中存在相关的实体的逻辑分组,机器学习分析可以创建数据模型并生成考虑这些分组的结果。例如,您可以选择按用户 ID 拆分数据,并检测用户访问资源的方式与他们通常的方式不同的时间。

如果您用于拆分数据的字段有许多不同的值,则作业将使用更多的内存资源。在 Kibana 中,如果 by_field_nameover_field_namepartition_field_name 的基数大于 1000,则作业创建向导会建议可能存在高内存使用量。同样,如果您正在执行群体分析,并且 over_field_name 的基数低于 10,则会建议您这可能不是适合使用的字段。

模型内存限制
编辑

对于每个异常检测作业,您可以选择指定 model_memory_limit,这是分析处理所需的最大内存资源的大概值。默认值为 1 GB。一旦接近此限制,数据修剪将变得更加激进。超过此限制后,将不会对新实体建模。

您还可以选择指定 xpack.ml.max_model_memory_limit 设置。默认情况下,未设置该设置,这意味着您的作业中可接受的 model_memory_limit 值没有上限。

如果将 model_memory_limit 设置得太高,则将无法打开作业;无法将作业分配给内存不足以运行它们的节点。

如果异常检测作业的估计模型内存限制大于作业的模型内存限制或集群的最大模型内存限制,则 Kibana 中的作业创建向导会生成警告。如果估计的内存需求仅比 model_memory_limit 略高,则该作业可能会产生有用的结果。否则,您为解决这些警告而采取的操作会因集群中可用的资源而异

  • 如果您使用 model_memory_limit 的默认值,并且集群中的机器学习节点具有大量内存,则最佳操作可能是简单地增加作业的 model_memory_limit。但是,在执行此操作之前,请仔细检查所选的分析是否合理。默认的 model_memory_limit 相对较低,以避免意外创建使用大量内存的作业。
  • 如果集群中的机器学习节点没有足够的内存来容纳估计大小的作业,则唯一的选项是

    • 向集群添加更大的机器学习节点,或
    • 接受该作业将达到其内存限制,并且不一定会找到它本来可以找到的所有异常。

如果您使用的是 Elastic Cloud Enterprise 或 Elastic Cloud 上托管的 Elasticsearch 服务,则会设置 xpack.ml.max_model_memory_limit,以防止您创建无法分配给集群中任何机器学习节点的作业。如果您发现无法增加机器学习作业的 model_memory_limit,则解决方案是增加集群中机器学习节点的大小。

专用索引
编辑

对于每个异常检测作业,您可以选择指定一个专用索引来存储异常检测结果。由于异常检测作业可能会产生大量的分析结果(例如,具有多个时间序列、较小的桶跨度或运行时间较长的作业),建议使用专用结果索引,方法是在 Kibana 中选择使用专用索引选项,或者通过创建异常检测作业 API 指定 results_index_name

数据源
编辑

如果您在 Kibana 中创建异常检测作业,则必须使用数据源从 Elasticsearch 中检索数据进行分析。当您创建异常检测作业时,您会选择一个数据视图,Kibana 会在后台为您配置数据源。

每个异常检测作业只能关联一个数据源。数据源包含一个查询,该查询以定义的时间间隔(frequency)运行。默认情况下,此间隔是相对于异常检测作业的桶跨度计算的。如果您担心数据延迟,可以在每次间隔运行查询之前添加延迟。请参阅处理延迟数据

数据源还可以在将数据发送到异常检测作业之前对其进行聚合。但是,存在一些限制,聚合通常只应用于低基数数据。请参阅聚合数据以加快性能

当启用 Elasticsearch 安全功能时,数据源会存储创建或更新数据源的用户的角色。这意味着,如果这些角色被更新,则数据源随后将使用与这些角色关联的新权限运行。但是,如果在创建或更新数据源后调整了用户的角色,则数据源将继续使用与原始角色关联的权限运行。

在不更改任何其他设置的情况下更新数据源中存储的角色的方法之一是,将一个空的 JSON 文档 ({}) 提交给 更新数据源 API

如果您要分析的数据未存储在 Elasticsearch 中,则无法使用数据源。但是,您可以使用将数据发布到作业 API 将成批数据直接发送到作业。 [7.11.0] 在 7.11.0 中已弃用。

打开作业

编辑

必须打开异常检测作业才能准备好接收和分析数据。在其整个生命周期中,它可以多次打开和关闭。

启动作业后,您可以启动数据源,该数据源从您的集群中检索数据。数据源在其整个生命周期中可以多次启动和停止。当您启动它时,您可以选择指定开始和结束时间。如果您不指定结束时间,数据源将持续运行。

您可以在 Kibana 中执行这两项任务,或者使用打开异常检测作业启动数据源 API。

调整作业

编辑

通常,在打开作业之后,下一步是查看结果。您可能会发现您需要更改作业配置或设置。

日历和计划事件
编辑

有时,您会预计会发生不寻常的活动,例如银行假日、“黑色星期五”或计划的系统中断。如果您提前确定这些事件,则在该期间不会生成异常。机器学习模型不会受到不良影响,您也不会收到虚假结果。

您可以在 Kibana 的机器学习页面上的设置窗格中创建日历和计划事件,或者使用机器学习异常检测 API

计划事件必须具有开始时间、结束时间和描述。一般来说,计划事件的持续时间较短(通常持续数小时到一天),并且不经常发生。如果您有定期发生的事件,例如每周维护期,则无需为这些情况创建计划事件;机器学习分析已经处理了这些事件。

您可以在日历中标识零个或多个计划事件。然后,异常检测作业可以订阅日历,机器学习分析会适当地处理所有后续计划事件。

如果您想一次添加多个计划事件,您可以在 Kibana 中导入 iCalendar (.ics) 文件,或者在添加事件到日历 API 中导入 JSON 文件。

  • 您必须在异常检测作业分析该时间段的数据之前识别计划事件。机器学习结果不会追溯更新。
  • 如果您的 iCalendar 文件包含重复事件,则只导入第一次出现的事件。
  • 桶结果在计划事件期间生成,但它们的异常分数是零。
  • 如果您使用较长或频繁的计划事件,机器学习分析可能需要更长的时间来学习建模您的数据,并且可能会遗漏一些异常行为。
自定义规则
编辑

默认情况下,异常检测是无监督的,机器学习模型不了解您数据的域。因此,异常检测作业可能会识别出在统计上显著但在您了解更大上下文时不感兴趣的事件。机器学习自定义规则使您可以自定义异常检测。

自定义规则(或 Kibana 中称为作业规则)指示异常检测器根据您提供的特定于领域的知识更改其行为。当您创建规则时,您可以指定条件、范围和操作。当满足规则的条件时,将触发其操作。

例如,如果您有一个正在分析 CPU 使用率的异常检测器,您可能会决定只对 CPU 使用率大于某个阈值的异常感兴趣。您可以定义一个带有条件和操作的规则,指示检测器在出现与低 CPU 使用率相关的异常事件时不要生成机器学习结果。您还可以决定为该规则添加一个范围,使其仅适用于某些机器。范围是通过使用机器学习过滤器定义的。

过滤器包含一个值列表,您可以使用这些值来包含或排除机器学习分析中的事件。您可以在多个异常检测作业中使用相同的过滤器。

如果您正在分析网络流量,您可能会创建一个包含 IP 地址列表的过滤器。例如,也许它们是您信任的 IP 地址,可以将数据上传到您的网站或从您的防火墙后面发送大量数据。您可以定义规则的范围,使其仅在数据中的特定字段与过滤器中的某个值匹配时触发。或者,您可以使其仅在字段值与过滤器值之一不匹配时触发。因此,您可以更好地控制哪些异常事件会影响机器学习模型并在机器学习结果中显示。

有关详细信息,请参阅使用自定义规则自定义检测器

模型快照
编辑

Elastic Stack 机器学习功能计算正常行为的基线,然后推断异常事件。这些基线是通过生成您的数据模型来实现的。

为了确保在发生系统故障时的弹性,每个异常检测作业的机器学习模型快照都保存到 Elasticsearch 集群内的内部索引中。保存这些快照所需的时间与内存中模型的大小成正比。默认情况下,快照大约每 3 到 4 小时捕获一次。您可以在创建或更新作业时更改此间隔 (background_persist_interval)。

为了减少集群上占用空间的快照数量,在每天结束时,会自动删除旧快照。每个快照的年龄是相对于最新快照的时间戳计算的。默认情况下,如果存在比最新快照早一天以上的快照,则会删除它们,但每天的第一个快照除外。此外,还会删除比最新快照早十天以上的所有快照。您可以在创建或更新作业时更改这些保留设置 (daily_model_snapshot_retention_after_daysmodel_snapshot_retention_days)。如果您想将特定快照从此次清理中排除,请使用 Kibana 或更新模型快照 APIretain 设置为 true

您可以使用获取模型快照 API 或在 Kibana 的作业管理页面上的模型快照选项卡中查看每个作业的模型快照列表

Example screenshot with a list of model snapshots

在系统故障之外,您可能还希望还原到使用特定模型快照。机器学习功能会对异常输入和数据中的新行为做出快速反应。高度异常的输入会增加模型中的方差,机器学习分析必须确定这是行为上的新阶跃变化还是一次性事件。如果您知道此异常输入是一次性的,则将模型状态重置为此事件之前的时间可能是合适的。例如,在黑色星期五销售日之后,您可能会考虑还原到已保存的快照。但是,如果您提前知道此类事件,则可以使用日历和计划事件以避免影响您的模型。

关闭作业

编辑

分析历史数据时,无需停止数据源和/或关闭作业,因为它们会在到达结束时间时自动停止和关闭。

如果您需要停止您的异常检测作业,有序关闭可确保

  • 数据源已停止
  • 缓冲区已刷新
  • 模型历史记录已修剪
  • 已计算最终结果
  • 已保存模型快照
  • 异常检测作业已关闭

此过程可确保作业处于一致状态,以防您随后想重新打开它们。

停止数据源
编辑

当您停止数据源时,它将停止从 Elasticsearch 中检索数据。您可以使用 Kibana 或停止数据源 API 来停止数据源。例如,以下请求将停止 feed1 数据源

POST _ml/datafeeds/feed1/_stop

您必须具有 manage_mlmanage 集群权限才能停止数据源。有关详细信息,请参阅安全权限

数据源在其整个生命周期中可以多次启动和停止。

停止所有数据源
编辑

如果您正在升级您的集群,您可以使用以下请求来停止所有数据源。

POST _ml/datafeeds/_all/_stop
关闭异常检测任务
编辑

当您关闭一个异常检测任务时,它将无法接收数据或执行分析操作。您可以使用关闭异常检测任务 API来关闭任务。例如,以下请求关闭名为 job1 的任务:

POST _ml/anomaly_detectors/job1/_close

您必须具有 manage_mlmanage 集群权限才能停止异常检测任务。更多信息,请参阅安全权限

如果您提交一个关闭异常检测任务的请求,并且其数据源正在运行,则该请求会首先尝试停止数据源。此行为等同于使用与关闭任务请求相同的 timeoutforce 参数调用 停止数据源 API

异常检测任务在其生命周期中可以多次打开和关闭。

关闭所有异常检测任务
编辑

如果您正在升级您的集群,您可以使用以下请求来关闭集群上所有打开的异常检测任务。

POST _ml/anomaly_detectors/_all/_close