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



假设我有一个长时间运行的更新查询,我将 ~200k 更新到 500k,甚至更多。为什么我需要更新这么多文档超出了问题的范围。

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

对于短请求,可以使用请求的响应,有没有办法我也获得请求的响应,或者是否可以指定请求的nameid以便以后引用它。

对于正在运行的请求:我可以使用tasks API来获取信息。

但是对于其他状态 - 已完成/失败,我如何获得它。 如果我尝试访问已经完成的任务,我会得到resource not found.

附言 我正在使用update_by_query进行更新

With the task id you can look up the task directly:
GET /_tasks/taskId:1

此 API 的优点是它与 wait_for_completion=false 以透明方式返回 已完成的任务。如果任务已完成并且 wait_for_completion=false 设置在他们上面,它会返回一个 结果或错误字段。此功能的成本是文档 wait_for_completion=false 在 .tasks/task/${taskId} 处创建。是的 由您决定删除该文档。

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

我的用例是这样的,我需要做一个update_by_query,我使用无痛作为脚本语言。起初我做了一个重新索引(测试时)。然后我尝试使用update_by_query功能(它们彼此非常相似)。我向任务 api 发出了请求(当然操作尚未完成),我看到任务正在执行。当它完成后,我做了一个查询,我正在操作的字段的数据已经消失了。该脚本有效,因为我对重新索引 api 使用相同的脚本,并且一切都按预期进行。由于时间不够,我没有进一步调查,但是...是的,彻底测试...

我觉得GET /_tasks/taskId:1令人困惑。它应该是

GET http://localhost:9200/_tasks/taskId

任务 ID 看起来像这样NCvmGYS-RsW2X8JxEYumgA:1204320.


这是我与这个话题相关的琐碎解释。

要检查任务,您需要知道其任务 ID。

任务 ID 是由node_id、冒号和task_sequence_number组成的字符串。一个例子是taskId = NCvmGYS-RsW2X8JxEYumgA:1204320node_id = NCvmGYS-RsW2X8JxEYumgAtask_sequence_number = 1204320的地方。包括我在内的一些人认为taskId = 1204320,但这不是 elasticsearch 代码库开发人员目前理解它的方式。

可以通过两种方式找到任务 ID。

  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.此示例将返回操作 = delete_by_query 的所有任务的状态。如果您知道 ES 上只有一个任务在运行,则可以从所有正在运行的任务的响应中找到您的 taskId。

知道任务 ID 后,您可以使用此获取任务的状态。

GET /_tasks/taskId

请注意,您只能在任务运行时查看任务的状态,或者使用wait_for_deletion == false生成任务时。

更琐碎的解释,wait_for_deletion默认是true.根据我的理解,具有wait_for_deletion = true的任务仅"在内存中"。您仍然可以在任务运行时检查任务的状态。但是在完成/取消后它完全消失了。这意味着检查状态将返回"resouce_not_found_exception"。具有wait_for_deletion = false的任务将存储在 ES 系统索引.task中。完成后,您仍然可以检查其状态。但是,您可能希望在完成此任务文档后从索引中删除.task以节省一些空间。删除请求如下所示

http://localhost:9200/.tasks/task/NCvmGYS-RsW2X8JxEYumgA:1204320

如果任务 ID 不存在,您将收到resouce_not_found_exception。(例如,您删除了某个任务两次,或者您正在删除内存中的任务,其wait_for_deletetion == true)。

关于这个令人困惑的taskId,我提出了一个拉取请求 https://github.com/elastic/elasticsearch/pull/31122 以帮助澄清Elasticsearch文档。不幸的是,他们拒绝了它。呸。

最新更新