任务管理 API
编辑任务管理 API编辑
任务管理 API 是一个新功能,目前仍处于测试阶段。该 API 可能发生不向后兼容的更改。有关功能状态,请参阅 #51628.
返回有关当前在集群中执行的任务的信息。
描述编辑
任务管理 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
检索当前在集群中所有节点上运行的所有任务。 |
|
检索在节点 |
|
检索在节点 |
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
任务取消命令支持与列出任务命令相同的任务选择参数,因此可以同时取消多个任务。例如,以下命令将取消在节点 nodeId1
和 nodeId2
上运行的所有重新索引任务。
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" } } ] } } }