获取长 运行 更新查询的 Elasticsearch 任务状态
Get status of a task Elasticsearch for a long running update query
假设我有一个很长的 运行 更新查询,我正在更新 ~200k 到 500k,甚至 more.Why 我需要更新这么多文档超出了问题的范围。
由于客户端超时(我使用的是官方ES python客户端),我希望有一种方法可以检查批量更新请求的状态,而不必使用巨大的超时值.
对于一个简短的请求,可以使用请求的响应,有没有办法我也可以获得请求的响应,或者我是否可以指定 name
或 id
请求以便稍后参考。
对于 运行 的请求:我可以使用 tasks API
来获取信息。
但对于其他状态——完成/失败,我如何获得它。
如果我尝试访问已经完成的任务,我会得到 resource not found
.
P.S。我正在使用 update_by_query
进行更新
With the task id you can look up the task directly:
GET /_tasks/taskId:1
The advantage of this API is that it integrates with
wait_for_completion=false to transparently return the status of
completed tasks. If the task is completed and
wait_for_completion=false was set on it them it’ll come back with a
results or an error field. The cost of this feature is the document
that wait_for_completion=false creates at .tasks/task/${taskId}. It is
up to you to delete that document.
我的用例是这样的,我需要做一个 update_by_query 并且我使用 painless 作为脚本语言。起初我做了一个重建索引(测试时)。然后我尝试使用 update_by_query
功能(它们彼此非常相似)。我对任务 api 做了一个请求(当然操作还没有完成),我看到了正在执行的任务。当它完成时,我做了一个查询,我正在操作的字段的数据已经消失了。该脚本有效,因为我对重新索引 api 使用了相同的脚本,并且一切都按预期进行。由于时间不够,我没有进一步调查,但是......是的,彻底测试......
我觉得GET /_tasks/taskId:1
难以理解。应该是
GET http://localhost:9200/_tasks/taskId
一个 taskId 看起来像这样 NCvmGYS-RsW2X8JxEYumgA:1204320
。
这是我对这个话题的简单解释。
要检查一个任务,您需要知道它的taskId。
任务 ID 是由 node_id、一个冒号和一个 task_sequence_number 组成的字符串。例如 taskId = NCvmGYS-RsW2X8JxEYumgA:1204320
,其中 node_id = NCvmGYS-RsW2X8JxEYumgA
和 task_sequence_number = 1204320
。包括我在内的一些人认为 taskId = 1204320
,但这不是 elasticsearch 代码库开发人员目前理解它的方式。
可以通过两种方式找到一个taskId。
wait_for_deletion = false
。向ES发送请求时,带此参数,响应为{"task" : "NCvmGYS-RsW2X8JxEYumgA:1204320"}
。然后,您可以像这样检查该任务的状态 GET http://localhost:9200/_tasks/NCvmGYS-RsW2X8JxEYumgA:1204320
GET http://localhost:9200/_tasks?detailed=false&actions=*/delete/byquery
。此示例将 return 您所有具有 action = delete_by_query 的任务的状态。如果你知道ES上只有一个任务运行,你可以从所有运行个任务的响应中找到你的taskId。
知道taskId后,就可以通过这个获取任务的状态
GET /_tasks/taskId
请注意,您只能在任务为 运行 或使用 wait_for_deletion == false
生成任务时查看任务状态。
更简单的解释,wait_for_deletion
默认是true
。根据我的理解,带有 wait_for_deletion = true
的任务仅是 "in-memory"。您仍然可以在 运行 期间检查任务的状态。但是到了completed/canceled之后就完全没有了。这意味着检查状态将 return 你 'resouce_not_found_exception'。 wait_for_deletion = false
的任务将存储在 ES 系统索引 .task
中。完成后您仍然可以检查它的状态。但是,您可能希望在完成此任务文档后从 .task
索引中删除它以节省一些 space。删除请求如下所示
http://localhost:9200/.tasks/task/NCvmGYS-RsW2X8JxEYumgA:1204320
如果 taskId 不存在,您将收到 resouce_not_found_exception
。 (例如,您删除了某个任务两次,或者您正在删除内存中的任务,其wait_for_deletetion == true
)。
关于这个令人困惑的 taskId 事情,我提出了一个拉取请求 https://github.com/elastic/elasticsearch/pull/31122 来帮助澄清 Elasticsearch 文档。不幸的是,他们拒绝了。呃。
假设我有一个很长的 运行 更新查询,我正在更新 ~200k 到 500k,甚至 more.Why 我需要更新这么多文档超出了问题的范围。
由于客户端超时(我使用的是官方ES python客户端),我希望有一种方法可以检查批量更新请求的状态,而不必使用巨大的超时值.
对于一个简短的请求,可以使用请求的响应,有没有办法我也可以获得请求的响应,或者我是否可以指定 name
或 id
请求以便稍后参考。
对于 运行 的请求:我可以使用 tasks API
来获取信息。
但对于其他状态——完成/失败,我如何获得它。
如果我尝试访问已经完成的任务,我会得到 resource not found
.
P.S。我正在使用 update_by_query
进行更新
With the task id you can look up the task directly:
GET /_tasks/taskId:1
The advantage of this API is that it integrates with wait_for_completion=false to transparently return the status of completed tasks. If the task is completed and wait_for_completion=false was set on it them it’ll come back with a results or an error field. The cost of this feature is the document that wait_for_completion=false creates at .tasks/task/${taskId}. It is up to you to delete that document.
我的用例是这样的,我需要做一个 update_by_query 并且我使用 painless 作为脚本语言。起初我做了一个重建索引(测试时)。然后我尝试使用 update_by_query
功能(它们彼此非常相似)。我对任务 api 做了一个请求(当然操作还没有完成),我看到了正在执行的任务。当它完成时,我做了一个查询,我正在操作的字段的数据已经消失了。该脚本有效,因为我对重新索引 api 使用了相同的脚本,并且一切都按预期进行。由于时间不够,我没有进一步调查,但是......是的,彻底测试......
我觉得GET /_tasks/taskId:1
难以理解。应该是
GET http://localhost:9200/_tasks/taskId
一个 taskId 看起来像这样 NCvmGYS-RsW2X8JxEYumgA:1204320
。
这是我对这个话题的简单解释。
要检查一个任务,您需要知道它的taskId。
任务 ID 是由 node_id、一个冒号和一个 task_sequence_number 组成的字符串。例如 taskId = NCvmGYS-RsW2X8JxEYumgA:1204320
,其中 node_id = NCvmGYS-RsW2X8JxEYumgA
和 task_sequence_number = 1204320
。包括我在内的一些人认为 taskId = 1204320
,但这不是 elasticsearch 代码库开发人员目前理解它的方式。
可以通过两种方式找到一个taskId。
wait_for_deletion = false
。向ES发送请求时,带此参数,响应为{"task" : "NCvmGYS-RsW2X8JxEYumgA:1204320"}
。然后,您可以像这样检查该任务的状态GET http://localhost:9200/_tasks/NCvmGYS-RsW2X8JxEYumgA:1204320
GET http://localhost:9200/_tasks?detailed=false&actions=*/delete/byquery
。此示例将 return 您所有具有 action = delete_by_query 的任务的状态。如果你知道ES上只有一个任务运行,你可以从所有运行个任务的响应中找到你的taskId。
知道taskId后,就可以通过这个获取任务的状态
GET /_tasks/taskId
请注意,您只能在任务为 运行 或使用 wait_for_deletion == false
生成任务时查看任务状态。
更简单的解释,wait_for_deletion
默认是true
。根据我的理解,带有 wait_for_deletion = true
的任务仅是 "in-memory"。您仍然可以在 运行 期间检查任务的状态。但是到了completed/canceled之后就完全没有了。这意味着检查状态将 return 你 'resouce_not_found_exception'。 wait_for_deletion = false
的任务将存储在 ES 系统索引 .task
中。完成后您仍然可以检查它的状态。但是,您可能希望在完成此任务文档后从 .task
索引中删除它以节省一些 space。删除请求如下所示
http://localhost:9200/.tasks/task/NCvmGYS-RsW2X8JxEYumgA:1204320
如果 taskId 不存在,您将收到 resouce_not_found_exception
。 (例如,您删除了某个任务两次,或者您正在删除内存中的任务,其wait_for_deletetion == true
)。
关于这个令人困惑的 taskId 事情,我提出了一个拉取请求 https://github.com/elastic/elasticsearch/pull/31122 来帮助澄清 Elasticsearch 文档。不幸的是,他们拒绝了。呃。