Ошибка сервера при выполнении операции Elasticsearch Reindex in place - PullRequest
0 голосов
/ 02 марта 2019

Я использую сервис AWS Elasticsearch (версия 6.3).Я заинтересован в изменении отображения при повторной индексации данных с current_index до new_index.Я не пытаюсь обновить старые кластеры Elasticsearch на новые.Мои current_index и new_index находятся в одном кластере Elasticsearch 6.3.
Я пытаюсь выполнить операцию Переиндексировать на месте , следуя информации из Эластичная документация
Мой индекс содержит около 250 тыс. Документов с возможностью поиска.Когда я 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_index совпадает с current_index и status превращается green


Если я POST _reindex из Java, я получаю эту ошибку:

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

Только когда размер документа в моем индексе невелик (я пытался использовать документы с возможностью поиска 1k), это когда API-интерфейс Reindex возвращает полностью успешно, как указано здесь

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

AWS Elasticsearch ELB (Elastic Load Balancer) имеет время ожидания 60 секунд.В настоящее время это не настраивается и является давним запросом функции
Более подробную информацию можно найти в этой ветке aws

В результате любой операции и в данном конкретном случаепереиндексация, занимающая более 60 секунд, приведет к превышению времени ожидания шлюза.
В результате невозможно заблокировать длительный переиндекс путем увеличения времени ожидания клиента.

Для API переиндексации обходной путьпредложенный @Val выше.То есть использовать флаг wait_for_completion=false и шаги, указанные в ссылке на документацию Reindex API: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html#_url_parameters_3

0 голосов
/ 02 марта 2019

Это потому, что ответ занимает много времени, чтобы вернуться и свернуть время ожидания.Для небольших наборов данных ответ возвращается до истечения времени ожидания, поэтому вы и получаете ответ.

Когда время ожидания curl истекает, переиндекс все еще выполняется, и вы все равно можете увидеть, какReindex делает с помощью этой команды:

GET _tasks?actions=*reindex&detailed=true

Что вы также можете сделать, это добавить ...?wait_for_completion=false к вашей команде curl.ES создаст фоновую задачу для вашей операции переиндексации.Команда curl завершается досрочно и возвращает taskId, который затем можно использовать для регулярной проверки состояния переиндексации с помощью Task API

GET .tasks/task/<taskId>

Также обратите внимание, что в этом случаеКогда задача будет выполнена, вам также нужно удалить задачу из индекса .tasks, ES не сделает это за вас.

...