Массовая индексация эластичного поиска и избыточные данные в действии - PullRequest
0 голосов
/ 14 ноября 2018

При индексации данных с использованием массового 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 ]

0 голосов
/ 14 ноября 2018

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

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

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

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

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

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

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

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

0 голосов
/ 16 ноября 2018

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

Как помогает массовый 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"}

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

$ 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 library.

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

0 голосов
/ 14 ноября 2018

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

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

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

Дополнительные параметры см. В статье Chepper in Bulk .

...