任务管理 API
编辑任务管理 API
编辑任务管理 API 是新的,仍应视为 beta 功能。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
的值。 -
timeout
- (可选,时间单位)等待每个节点响应的时间段。如果节点在其超时时间到期之前没有响应,则响应不包括其信息。但是,超时节点包含在响应的
node_failures
属性中。默认为30s
。 -
wait_for_completion
- (可选,布尔值)如果为
true
,则请求会阻塞,直到找到的所有任务都完成。默认为false
。
响应代码
编辑-
404
(缺少资源) - 如果指定了
<task_id>
但未找到,则此代码指示没有与请求匹配的资源。
示例
编辑resp = client.tasks.list() print(resp) resp1 = client.tasks.list( nodes="nodeId1,nodeId2", ) print(resp1) resp2 = client.tasks.list( nodes="nodeId1,nodeId2", actions="cluster:*", ) print(resp2)
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
const response = await client.tasks.list(); console.log(response); const response1 = await client.tasks.list({ nodes: "nodeId1,nodeId2", }); console.log(response1); const response2 = await client.tasks.list({ nodes: "nodeId1,nodeId2", actions: "cluster:*", }); console.log(response2);
检索当前在集群中所有节点上运行的所有任务。 |
|
检索在节点 |
|
检索在节点 |
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
的信息
resp = client.tasks.get( task_id="oTUltX4IQMOUUVeiohTt8A:124", ) print(resp)
response = client.tasks.get( task_id: 'oTUltX4IQMOUUVeiohTt8A:124' ) puts response
const response = await client.tasks.get({ task_id: "oTUltX4IQMOUUVeiohTt8A:124", }); console.log(response);
GET _tasks/oTUltX4IQMOUUVeiohTt8A:124
如果未找到该任务,API 将返回 404。
要检索特定任务的所有子任务
resp = client.tasks.list( parent_task_id="oTUltX4IQMOUUVeiohTt8A:123", ) print(resp)
response = client.tasks.list( parent_task_id: 'oTUltX4IQMOUUVeiohTt8A:123' ) puts response
const response = await client.tasks.list({ parent_task_id: "oTUltX4IQMOUUVeiohTt8A:123", }); console.log(response);
GET _tasks?parent_task_id=oTUltX4IQMOUUVeiohTt8A:123
如果未找到父任务,API 不会返回 404。
获取有关任务的更多信息
编辑您还可以使用 detailed
请求参数来获取有关正在运行的任务的更多信息。这有助于区分任务,但执行成本更高。例如,使用 detailed
请求参数获取所有搜索
resp = client.tasks.list( actions="*search", detailed=True, ) print(resp)
response = client.tasks.list( actions: '*search', detailed: true ) puts response
const response = await client.tasks.list({ actions: "*search", detailed: "true", }); console.log(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
的任务完成。
resp = client.tasks.get( task_id="oTUltX4IQMOUUVeiohTt8A:12345", wait_for_completion=True, timeout="10s", ) print(resp)
response = client.tasks.get( task_id: 'oTUltX4IQMOUUVeiohTt8A:12345', wait_for_completion: true, timeout: '10s' ) puts response
const response = await client.tasks.get({ task_id: "oTUltX4IQMOUUVeiohTt8A:12345", wait_for_completion: "true", timeout: "10s", }); console.log(response);
GET _tasks/oTUltX4IQMOUUVeiohTt8A:12345?wait_for_completion=true&timeout=10s
您还可以等待某些操作类型的所有任务完成。此命令将等待所有 reindex
任务完成
resp = client.tasks.list( actions="*reindex", wait_for_completion=True, timeout="10s", ) print(resp)
response = client.tasks.list( actions: '*reindex', wait_for_completion: true, timeout: '10s' ) puts response
const response = await client.tasks.list({ actions: "*reindex", wait_for_completion: "true", timeout: "10s", }); console.log(response);
GET _tasks?actions=*reindex&wait_for_completion=true&timeout=10s
任务取消
编辑如果长时间运行的任务支持取消,则可以使用取消任务 API 取消它。以下示例取消任务 oTUltX4IQMOUUVeiohTt8A:12345
resp = client.tasks.cancel( task_id="oTUltX4IQMOUUVeiohTt8A:12345", ) print(resp)
response = client.tasks.cancel( task_id: 'oTUltX4IQMOUUVeiohTt8A:12345' ) puts response
const response = await client.tasks.cancel({ task_id: "oTUltX4IQMOUUVeiohTt8A:12345", }); console.log(response);
POST _tasks/oTUltX4IQMOUUVeiohTt8A:12345/_cancel
任务取消命令支持与列出任务命令相同的任务选择参数,因此可以同时取消多个任务。例如,以下命令将取消在节点 nodeId1
和 nodeId2
上运行的所有 reindex 任务。
resp = client.tasks.cancel( nodes="nodeId1,nodeId2", actions="*reindex", ) print(resp)
response = client.tasks.cancel( nodes: 'nodeId1,nodeId2', actions: '*reindex' ) puts response
const response = await client.tasks.cancel({ nodes: "nodeId1,nodeId2", actions: "*reindex", }); console.log(response);
POST _tasks/_cancel?nodes=nodeId1,nodeId2&actions=*reindex
任务在取消后可能会继续运行一段时间,因为它可能无法立即安全地停止其当前活动,或者因为 Elasticsearch 必须先完成其他任务的工作,然后才能处理取消。列出任务 API 将继续列出这些已取消的任务,直到它们完成。列出任务 API 响应中的 cancelled
标志指示已处理取消命令,并且任务将尽快停止。要解决为什么已取消的任务没有及时完成的问题,请使用带有 ?detailed
参数的列出任务 API 来识别系统正在运行的其他任务,并使用 节点热线程 API 来获取有关系统正在执行的工作的详细信息,而不是完成已取消的任务。
任务分组
编辑任务 API 命令返回的任务列表可以使用 group_by
参数按节点(默认)或按父任务分组。以下命令会将分组更改为父任务
resp = client.tasks.list( group_by="parents", ) print(resp)
response = client.tasks.list( group_by: 'parents' ) puts response
const response = await client.tasks.list({ group_by: "parents", }); console.log(response);
GET _tasks?group_by=parents
可以通过指定 none
作为 group_by
参数来禁用分组
resp = client.tasks.list( group_by="none", ) print(resp)
response = client.tasks.list( group_by: 'none' ) puts response
const response = await client.tasks.list({ group_by: "none", }); console.log(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" } } ] } } }