Возникла задача. Нужно обойти 5 млн. записей в Эластике, в каждую внести изменение, потом сохранить обратно. Пошел стандартным путем. Создал scroll-окно, получил первые 4000 записей, модифицировал их (добавил новую key-value значение), сформировал bulk-запрос, вызвал его.... и все. Больше ничего не происходит.
Такое ощущение, что делать одновременно scan и bulk нельзя, но конкретики не нашел.
А можно подробнее про эту часть? Что значит ничего не происходи? Запрос завис или он вернулся, но записи не обновились? Если запрос вернулся, что было в ответе сервера?
И еще пара вопросов. На каком языке все это написано? И сколько записей в индексе?
Сейчас уже все сделал. Проблема оказалась в том, что за раз выбиралось 4000 записей, модифицировались, и 4000 записей пытались записаться. Изменил на 1500 - все стало нормально. Размер одной записи примерно килобайт в виде JSON.
Кейсы были такие (воспроизвожу хронологически):
Был проведен один цикл чтения, запись, и все, На записи все повисло, по таймауту не отвалилось.
Один цикл чтения, запись, на записи вис 60 секунд, затем ошибка таймаута, и вылет ES. Перезагрузил.
Повтор 1-го кейса
Исправил число извлекаемых за раз записей на 1500. После этого все ок.
Язык - Ruby + гем ruby-elasticsearch (который стандартный, без дополнительных фреймворков). В индексе несколько types, в сумме около 30 млн. записей. Из них 5 млн. - в том types, про который я написал.
4000 x 1K = 4G и этот запрос должен целиком умещаться в памяти сервере для того, чтобы его обработать. Если на сервере памяти не достаточно, то сервер действительно может зависнуть пытаясь эту память найти. Изменение 1/6 записей из индекса описаным образом вполне разумен. Но если вам, когда-нибудь, надо будет изменить 30-50% или больше записей в индексе, то быстрее может быть проиндексировать записи в новый индекс и старый индекс затем удалить.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.