Массовая индексация эластичного поиска и избыточные данные в действии

При индексации данных с использованием массового API эластичного поиска приведен пример json из документации сайта.

POST _bulk
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "field1" : "value2" }
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }

При "подготовке" данных, которые будут использоваться массовым API, в первой строке я должен указать операцию, а в следующей строке я предоставлю данные. Некоторые избыточные части в каждой строке могут выглядеть очевидными и довольно безопасными, но когда я индексирую триллионы строк, разве это не приводит к задержке? Есть ли лучший способ подтолкнуть все строки, указав имя индекса и введите только один раз в заголовке? Особенно, когда я могу использовать автоматически сгенерированный идентификатор, я могу избежать генерации терабайтов данных, просто чтобы снова и снова добавляться к каждой строке для одной и той же цели.

Я полагаю, что я упускаю что-то очевидное здесь, иначе я уверен, что эти ребята в эластичны достаточно умны, чтобы понять это уже, и если они сделали это таким образом, должна быть какая-то причина. Но что?

3 ответа

Решение

Здесь у вас есть ярлык:

POST /test/_doc/_bulk
{ "index": {} }
{ "field1" : "value1" }
{ "index": {} }
{ "field1" : "value2" }
{ "index": {} }
{ "field1" : "value3" }

К сожалению, вам все еще нужно повторить { "index": {} } строка, кроме имени индекса и типа документа, которые вы указали в пути.

Пожалуйста, смотрите больше вариантов в статье дешевле.

Как уже говорилось в прекрасном ответе Петра Прадзинского, вы ничего не можете сделать, и минимальный след - это тот, который предложил Петр. Есть пара деталей, которые я считаю заслуживающими добавления.

Как помогает массовый API?

Основная причина, по которой стоит рассмотреть массовый API, - это настройка скорости индексации. Улучшения в производительности здесь во многом благодаря экономии на обработке меньшего количества HTTP-соединений на стороне Elasticsearch. Практически говоря, ваш кластер не будет быстрее индексировать документы, если вам удастся не отправлять эти повторяющиеся документы. { "index": {} } частей.

Что делать, если пропускная способность сети является шейкой?

В этом случае я считаю, что лучшее, что можно сделать, это отправить сжатые данные, например так:

curl -v 'http://localhost:9200/my_index/doc/_bulk' \
    -H "Content-encoding: gzip"
    -H "content-type: application/json; charset=UTF-8"
    -X POST --data-binary @bulk_data.json.gz

Чтобы проиллюстрировать идею, я сгенерировал файл со случайными данными, который выглядит следующим образом:

$ head bulk_data.json
{"index":{}}
{"request_id":"40485"}
{"index":{}}
{"request_id":"12417"}
{"index":{}}
{"request_id":"11945"}
{"index":{}}
{"request_id":"81722"}
{"index":{}}
{"request_id":"52613"}

Размер файла в 10 раз меньше после сжатия с помощью GZip:

$ ls -l
-rw-r--r--  1 vasiliev  staff  358836 Nov 16 20:09 bulk_data.json
-rw-r--r--  1 vasiliev  staff   35744 Nov 16 19:41 bulk_data.json.gz

Это может очень помочь в случае ограниченной пропускной способности.

Сжатие также доступно из клиентских библиотек, таких как библиотека asticsearch -py.

Надеюсь, это поможет!

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

Вы можете просто написать код для создания желаемого JSON и отправить его через _bulk API.

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

Или вместо пакетной обработки, вы можете получить документ за документом, т.е. event based используя очереди сообщений. (Лучший подход для минимизации задержки в процессе индексации)

Другим вариантом является создание входного файла скажем data.json(чисто пакетная обработка) с использованием простой Java-программы или любого другого языка программирования, который вы используете, добавьте все документы, которые вы хотите программно, и используйте команду CURL для отправки запроса, как показано ниже:

$ curl -s -XPOST <host_name>:9200/_bulk --data-binary @data.json

Так для этого indexer Приложение, вы можете добавить планирование, а также почтовые уведомления таким образом, чтобы вы знали состояние каждого запуска задания и график времени, когда каждый день / неделю, в зависимости от ваших требований.

Ото, вы можете использовать Logstash, Извините, это не лучший ответ, но я надеюсь, что это поможет.

Другие вопросы по тегам