获取长 运行 更新查询的 Elasticsearch 任务状态

Get status of a task Elasticsearch for a long running update query

假设我有一个很长的 运行 更新查询,我正在更新 ~200k 到 500k,甚至 more.Why 我需要更新这么多文档超出了问题的范围。

由于客户端超时(我使用的是官方ES python客户端),我希望有一种方法可以检查批量更新请求的状态,而不必使用巨大的超时值.

对于一个简短的请求,可以使用请求的响应,有没有办法我也可以获得请求的响应,或者我是否可以指定 nameid请求以便稍后参考。

对于 运行 的请求:我可以使用 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.

从这里开始https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html#docs-update-by-query-task-api

我的用例是这样的,我需要做一个 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-RsW2X8JxEYumgAtask_sequence_number = 1204320。包括我在内的一些人认为 taskId = 1204320,但这不是 elasticsearch 代码库开发人员目前理解它的方式。

可以通过两种方式找到一个taskId。

  1. wait_for_deletion = false。向ES发送请求时,带此参数,响应为{"task" : "NCvmGYS-RsW2X8JxEYumgA:1204320"}。然后,您可以像这样检查该任务的状态 GET http://localhost:9200/_tasks/NCvmGYS-RsW2X8JxEYumgA:1204320
  2. 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 文档。不幸的是,他们拒绝了。呃。