任务管理 API编辑

任务管理 API 是一个新功能,目前仍处于测试阶段。该 API 可能发生不向后兼容的更改。有关功能状态,请参阅 #51628.

返回有关当前在集群中执行的任务的信息。

请求编辑

GET /_tasks/<task_id>

GET /_tasks

先决条件编辑

  • 如果启用了 Elasticsearch 安全功能,则必须具有 monitormanage 集群权限 才能使用此 API。

描述编辑

任务管理 API 返回有关当前在集群中的一个或多个节点上执行的任务的信息。

路径参数编辑

<task_id>
(可选,字符串) 要返回的任务 ID (node_id:task_number)。

查询参数编辑

actions

(可选,字符串) 用于限制请求的操作的逗号分隔列表或通配符表达式。

省略此参数以返回所有操作。

detailed
(可选,布尔值) 如果为 true,则响应将包含有关分片恢复的详细信息。默认为 false
group_by

(可选,字符串) 用于在响应中对任务进行分组的键。

可能的值是

nodes
(默认) 节点 ID
parents
父任务 ID
none
不分组任务。
nodes
(可选,字符串) 用于限制返回信息的节点 ID 或名称的逗号分隔列表。
parent_task_id

(可选,字符串) 用于限制返回信息的父任务 ID。

要返回所有任务,请省略此参数或使用 -1 的值。

master_timeout
(可选,时间单位) 等待主节点的时间段。如果在超时时间到期之前主节点不可用,则请求将失败并返回错误。默认为 30s。也可以设置为 -1 以指示请求永远不会超时。
timeout
(可选,时间单位) 等待响应的时间段。如果在超时时间到期之前未收到响应,则请求将失败并返回错误。默认为 30s
wait_for_completion
(可选,布尔值) 如果为 true,则请求将阻塞,直到所有找到的任务都完成。默认为 false

响应代码编辑

404 (缺少资源)
如果指定了 <task_id> 但未找到,则此代码表示没有与请求匹配的资源。

示例编辑

response = client.tasks.list
puts response

response = client.tasks.list(
  nodes: 'nodeId1,nodeId2'
)
puts response

response = client.tasks.list(
  nodes: 'nodeId1,nodeId2',
  actions: 'cluster:*'
)
puts response
GET _tasks 
GET _tasks?nodes=nodeId1,nodeId2 
GET _tasks?nodes=nodeId1,nodeId2&actions=cluster:* 

检索当前在集群中所有节点上运行的所有任务。

检索在节点 nodeId1nodeId2 上运行的所有任务。有关如何选择单个节点的更多信息,请参阅 节点规范

检索在节点 nodeId1nodeId2 上运行的所有与集群相关的任务。

API 返回以下结果

{
  "nodes" : {
    "oTUltX4IQMOUUVeiohTt8A" : {
      "name" : "H5dfFeA",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "tasks" : {
        "oTUltX4IQMOUUVeiohTt8A:124" : {
          "node" : "oTUltX4IQMOUUVeiohTt8A",
          "id" : 124,
          "type" : "direct",
          "action" : "cluster:monitor/tasks/lists[n]",
          "start_time_in_millis" : 1458585884904,
          "running_time_in_nanos" : 47402,
          "cancellable" : false,
          "parent_task_id" : "oTUltX4IQMOUUVeiohTt8A:123"
        },
        "oTUltX4IQMOUUVeiohTt8A:123" : {
          "node" : "oTUltX4IQMOUUVeiohTt8A",
          "id" : 123,
          "type" : "transport",
          "action" : "cluster:monitor/tasks/lists",
          "start_time_in_millis" : 1458585884904,
          "running_time_in_nanos" : 236042,
          "cancellable" : false
        }
      }
    }
  }
}

从特定任务检索信息编辑

也可以检索特定任务的信息。以下示例检索有关任务 oTUltX4IQMOUUVeiohTt8A:124 的信息

response = client.tasks.get(
  task_id: 'oTUltX4IQMOUUVeiohTt8A:124'
)
puts response
GET _tasks/oTUltX4IQMOUUVeiohTt8A:124

如果未找到任务,则 API 将返回 404。

要检索特定任务的所有子任务

response = client.tasks.list(
  parent_task_id: 'oTUltX4IQMOUUVeiohTt8A:123'
)
puts response
GET _tasks?parent_task_id=oTUltX4IQMOUUVeiohTt8A:123

如果未找到父任务,则 API 不会返回 404。

获取有关任务的更多信息编辑

您还可以使用 detailed 请求参数来获取有关正在运行的任务的更多信息。这对于区分任务很有用,但执行成本更高。例如,使用 detailed 请求参数获取所有搜索

response = client.tasks.list(
  actions: '*search',
  detailed: true
)
puts response
GET _tasks?actions=*search&detailed

API 返回以下结果

{
  "nodes" : {
    "oTUltX4IQMOUUVeiohTt8A" : {
      "name" : "H5dfFeA",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "tasks" : {
        "oTUltX4IQMOUUVeiohTt8A:464" : {
          "node" : "oTUltX4IQMOUUVeiohTt8A",
          "id" : 464,
          "type" : "transport",
          "action" : "indices:data/read/search",
          "description" : "indices[test], types[test], search_type[QUERY_THEN_FETCH], source[{\"query\":...}]",
          "start_time_in_millis" : 1483478610008,
          "running_time_in_nanos" : 13991383,
          "cancellable" : true,
          "cancelled" : false
        }
      }
    }
  }
}

新的 description 字段包含可读的文本,用于识别任务正在执行的特定请求,例如识别由搜索任务执行的搜索请求,如上面的示例。其他类型的任务具有不同的描述,例如 _reindex 具有源和目标,或者 _bulk 仅具有请求数和目标索引。许多请求将只包含一个空描述,因为有关请求的更多详细信息不容易获得或在识别请求时特别有用。

带有 detailed_tasks 请求也可能返回 status。这是对任务内部状态的报告。因此,它的格式因任务而异。虽然我们尝试保持特定任务的 status 在版本之间保持一致,但这并不总是可能的,因为我们有时会更改实现。在这种情况下,我们可能会从特定请求的 status 中删除字段,因此您对状态进行的任何解析可能会在次要版本中中断。

等待完成编辑

任务 API 也可用于等待特定任务完成。以下调用将阻塞 10 秒,或直到 ID 为 oTUltX4IQMOUUVeiohTt8A:12345 的任务完成。

response = client.tasks.get(
  task_id: 'oTUltX4IQMOUUVeiohTt8A:12345',
  wait_for_completion: true,
  timeout: '10s'
)
puts response
GET _tasks/oTUltX4IQMOUUVeiohTt8A:12345?wait_for_completion=true&timeout=10s

您还可以等待所有特定操作类型的任务完成。此命令将等待所有 reindex 任务完成

response = client.tasks.list(
  actions: '*reindex',
  wait_for_completion: true,
  timeout: '10s'
)
puts response
GET _tasks?actions=*reindex&wait_for_completion=true&timeout=10s

任务取消编辑

如果长时间运行的任务支持取消,则可以使用取消任务 API 取消它。以下示例取消任务 oTUltX4IQMOUUVeiohTt8A:12345

response = client.tasks.cancel(
  task_id: 'oTUltX4IQMOUUVeiohTt8A:12345'
)
puts response
POST _tasks/oTUltX4IQMOUUVeiohTt8A:12345/_cancel

任务取消命令支持与列出任务命令相同的任务选择参数,因此可以同时取消多个任务。例如,以下命令将取消在节点 nodeId1nodeId2 上运行的所有重新索引任务。

response = client.tasks.cancel(
  nodes: 'nodeId1,nodeId2',
  actions: '*reindex'
)
puts response
POST _tasks/_cancel?nodes=nodeId1,nodeId2&actions=*reindex

任务可能在被取消后继续运行一段时间,因为它可能无法立即安全地停止其当前活动,或者因为 Elasticsearch 必须完成其在其他任务上的工作才能处理取消。列出任务 API 将继续列出这些已取消的任务,直到它们完成。列出任务 API 响应中的 cancelled 标志表示已处理取消命令,并且任务将在尽快停止。要排查已取消的任务为何没有及时完成,请使用带有 ?detailed 参数的列出任务 API 来识别系统正在运行的其他任务,并使用 节点热线程 API 来获取有关系统正在执行的工作的详细信息,而不是完成已取消的任务。

任务分组编辑

任务 API 命令返回的任务列表可以按节点(默认)或按父任务进行分组,使用 group_by 参数。以下命令将更改分组为父任务

response = client.tasks.list(
  group_by: 'parents'
)
puts response
GET _tasks?group_by=parents

可以通过指定 none 作为 group_by 参数来禁用分组

response = client.tasks.list(
  group_by: 'none'
)
puts response
GET _tasks?group_by=none

识别正在运行的任务编辑

当在 HTTP 请求标头中提供 X-Opaque-Id 标头时,它将作为标头在响应中返回,以及在任务信息中的 headers 字段中返回。这允许跟踪某些调用,或将某些任务与启动它们的客户端关联起来

curl -i -H "X-Opaque-Id: 123456" "https://127.0.0.1:9200/_tasks?group_by=parents"

API 返回以下结果

HTTP/1.1 200 OK
X-Opaque-Id: 123456 
content-type: application/json; charset=UTF-8
content-length: 831

{
  "tasks" : {
    "u5lcZHqcQhu-rUoFaqDphA:45" : {
      "node" : "u5lcZHqcQhu-rUoFaqDphA",
      "id" : 45,
      "type" : "transport",
      "action" : "cluster:monitor/tasks/lists",
      "start_time_in_millis" : 1513823752749,
      "running_time_in_nanos" : 293139,
      "cancellable" : false,
      "headers" : {
        "X-Opaque-Id" : "123456" 
      },
      "children" : [
        {
          "node" : "u5lcZHqcQhu-rUoFaqDphA",
          "id" : 46,
          "type" : "direct",
          "action" : "cluster:monitor/tasks/lists[n]",
          "start_time_in_millis" : 1513823752750,
          "running_time_in_nanos" : 92133,
          "cancellable" : false,
          "parent_task_id" : "u5lcZHqcQhu-rUoFaqDphA:45",
          "headers" : {
            "X-Opaque-Id" : "123456" 
          }
        }
      ]
    }
  }
}

作为响应标头的一部分的 ID

由 REST 请求启动的任务的 ID

由 REST 请求启动的任务的子任务