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

时间:2018-03-22 22:21:27

标签: elasticsearch nosql elasticsearch-5

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

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

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

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

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

P.S。我使用update_by_query进行更新

2 个答案:

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

答案 1 :(得分:0)

我觉得GET /_tasks/taskId:1容易理解。它应该是

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

taskId看起来像这样NCvmGYS-RsW2X8JxEYumgA:1204320

以下是与此主题相关的简单解释。

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

任务ID是由node_id,冒号和task_sequence_number组成的字符串。一个例子是taskId = NCvmGYS-RsW2X8JxEYumgA:1204320node_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. 一样检查该任务的状态
  3. GET http://localhost:9200/_tasks?detailed=false&actions=*/delete/byquery。此示例将使用action = delete_by_query返回所有任务的状态。如果您知道ES上只运行一个任务,您可以从所有正在运行的任务的响应中找到您的taskId。
  4. 在您了解taskId之后,您可以使用此功能获取任务的状态。

    GET /_tasks/taskId
    

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

    更简单的解释,wait_for_deletion默认为true。根据我的理解,wait_for_deletion = true的任务是"在记忆中"只要。您仍然可以在任务运行时检查其状态。但它在完成/取消后完全消失了。检查状态的含义将返回“resouce_not_found_exception”' 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的内存中任务。

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