就地执行Elasticsearch Reindex操作时发生服务器错误

时间:2019-03-02 02:00:45

标签: java amazon-web-services elasticsearch reindex

我正在使用AWS Elasticsearch服务(版本6.3)。我对在将数据从current_index重新索引到new_index时更改映射感兴趣。我不是要从旧的Elasticsearch集群升级到新集群。我的current_indexnew_index都在同一个Elasticsearch 6.3集群上。
我要遵循Elastic documentation的信息,尝试执行就地重新索引操作
我的索引包含大约25万个可搜索文档。当我POST _reindex使用curl请求时,

curl -X POST "aws_elasticsearch_endpoint/_reindex" -H 'Content-Type: application/json' -d'
{
  "source": {
    "index": "current_index"
  },
  "dest": {
    "index": "new_index"
  }
}
'

Elasticsearch开始重新索引过程(我通过执行GET /_cat/indices?v来验证此过程),最终遇到curl: (56) Unexpected EOF错误。 Reindex操作实际上可以正常工作。大约2小时后,doc.count中的new_indexcurrent_index相匹配,并且status变成green


如果我来自Java POST _reindex,则会收到此错误:

java.net.SocketException: Unexpected end of file from server

仅当索引中的文档大小较小(我尝试使用可搜索1k的文档)时,Reindex API才能成功返回指定的here

2 个答案:

答案 0 :(得分:1)

这是因为响应需要很长时间才能返回,并且卷曲时间超时。在小型数据集上,响应会在超时之前返回,因此您为什么会得到响应。

但是,当curl超时时,重新索引仍在进行中,您仍然可以使用以下命令查看重新索引的执行情况:

GET _tasks?actions=*reindex&detailed=true

您还可以做的是在curl命令中添加...?wait_for_completion=false。 ES将为您的重新索引操作创建一个后台任务。 curl命令将提前终止并返回一个taskId,然后您可以使用它Task API

来定期检查重新索引的状态
GET .tasks/task/<taskId>

还要注意,在这种情况下,完成任务后,您还需要从.tasks索引中删除任务,ES不会为您完成。

答案 1 :(得分:1)

AWS Elasticsearch ELB(弹性负载平衡器)的超时时间为60秒。目前无法配置,这是一个长期存在的功能要求
您可以在此aws forum thread

中找到更多详细信息

因此,任何操作(在这种情况下重新建立索引的时间超过60秒)都会导致网关超时。
因此,不可能通过增加客户端超时来阻止长时间运行的重新索引。

对于reindex API,解决方法如上述@Val所建议。 那就是使用wait_for_completion=false标志和Reindex API文档链接中提到的步骤: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html#_url_parameters_3