【问题标题】:Get status of a task Elasticsearch for a long running update query为长时间运行的更新查询获取 Elasticsearch 任务的状态
【发布时间】:2018-03-22 22:21:26
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 是否有充分的理由不将您的查询分成几块?你仍然可以使用批量 API,也许只是将它们分成 500 个块。
  • 是的。所以这是一个 update_by_query 请求,我想更新所有具有此属性特定值的文档的属性。例如。每个将 company_name 设为“flipkart”的文档都将其更新为“flipkart group”
  • 您是否使用带有 _update_by_query 的切片滚动,这会并行化此操作?您还可以增加请求超时值。
  • 是的,我也在使用切片(设置为大约 80% 的分片数量)并且也可以增加超时。但是,就像我在问题中提到的那样,我想避免这样做,并在以后知道查询是否成功。如果不支持开箱即用,是否有我可以使用的方法或实现来做到这一点。
  • 您可以使用任务 api 来做到这一点 elastic.co/guide/en/elasticsearch/reference/current/… 但先测试它。当我尝试它并在 update_by_query 操作完成之前获得状态时,它破坏了我的数据

标签: elasticsearch nosql elasticsearch-5


【解决方案1】:
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 并且我使用 painless 作为脚本语言。起初我做了一个重新索引(测试时)。然后我尝试使用update_by_query 功能(它们非常相似)。我对任务 api 做了一个请求(操作当然还没有完成),我看到任务正在执行。当它完成时,我做了一个查询,我正在操作的字段的数据已经消失了。该脚本有效,因为我对 reindex api 使用了相同的脚本,并且一切都按应有的方式进行。由于时间不够,我没有进一步调查,但是......是的,彻底测试......

【讨论】:

  • 谢谢。我最近发现了 wait_for_completion=false 参数,应该在文档中更清楚地提到它。
  • 除了使用任务 API 之外,还有其他选择吗?我有一个旧版本。
【解决方案2】:

我觉得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,但目前弹性搜索代码库开发人员并不是这样理解的。

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

知道taskId后,就可以通过这个获取任务的状态了。

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

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

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

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多