Как делать массовый обход всех записей (scan & bulk)?


#1

Привет!

Возникла задача. Нужно обойти 5 млн. записей в Эластике, в каждую внести изменение, потом сохранить обратно. Пошел стандартным путем. Создал scroll-окно, получил первые 4000 записей, модифицировал их (добавил новую key-value значение), сформировал bulk-запрос, вызвал его.... и все. Больше ничего не происходит.

Такое ощущение, что делать одновременно scan и bulk нельзя, но конкретики не нашел.

Какой best way делать такие вещи?

Заранее спасибо!


(Igor Motov) #2

А можно подробнее про эту часть? Что значит ничего не происходи? Запрос завис или он вернулся, но записи не обновились? Если запрос вернулся, что было в ответе сервера?

И еще пара вопросов. На каком языке все это написано? И сколько записей в индексе?


#3

Сейчас уже все сделал. Проблема оказалась в том, что за раз выбиралось 4000 записей, модифицировались, и 4000 записей пытались записаться. Изменил на 1500 - все стало нормально. Размер одной записи примерно килобайт в виде JSON.

Кейсы были такие (воспроизвожу хронологически):

  1. Был проведен один цикл чтения, запись, и все, На записи все повисло, по таймауту не отвалилось.
  2. Один цикл чтения, запись, на записи вис 60 секунд, затем ошибка таймаута, и вылет ES. Перезагрузил.
  3. Повтор 1-го кейса
  4. Исправил число извлекаемых за раз записей на 1500. После этого все ок.

Язык - Ruby + гем ruby-elasticsearch (который стандартный, без дополнительных фреймворков). В индексе несколько types, в сумме около 30 млн. записей. Из них 5 млн. - в том types, про который я написал.


(Igor Motov) #4

4000 x 1K = 4G и этот запрос должен целиком умещаться в памяти сервере для того, чтобы его обработать. Если на сервере памяти не достаточно, то сервер действительно может зависнуть пытаясь эту память найти. Изменение 1/6 записей из индекса описаным образом вполне разумен. Но если вам, когда-нибудь, надо будет изменить 30-50% или больше записей в индексе, то быстрее может быть проиндексировать записи в новый индекс и старый индекс затем удалить.


#5

Ой! Прошу прощения - 1024 байта, то есть 1 кбайт.


(Igor Motov) #6

Нет, это я просто не достаточно кофе выпил. 4М получается на запрос. Странно, должен был бы потянуть.


#7

В общем, непонятно. Но сейчас все работает, так что видимо, отбой.


(Igor Motov) #8

Если опять поломается - пишите. Было бы интересно разобраться, что там происходит.


#9

Хорошо :slight_smile: Спасибо!


(system) #10