Массовая индексация эластичного поиска и избыточные данные в действии
При индексации данных с использованием массового 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
, Извините, это не лучший ответ, но я надеюсь, что это поможет.