2016-02-28 4 views
1

Привет, Мне нужно прочитать несколько таблиц из моих баз данных и присоединиться к таблицам. Как только таблицы будут объединены, я хотел бы нажать их в Elasticsearch.Попытка массового/глотать «большое» количество документов SQL Db to Elasticsearch

Таблицы объединены с внешним процессом, поскольку данные могут поступать из нескольких источников. Это не проблема. У меня есть 3 отдельных процесса, которые читают 3 отдельные таблицы в среднем 30 000 записей в секунду. Записи объединяются в мультимап, и затем для каждого ключа создается один JsonDocument.

Затем отдельный процесс читает денормализованные JsonDocuments и отправляет их в Elasticsearch в среднем 3000 документов в секунду.

У меня возникли проблемы, пытаясь найти способ разделить работу. Я уверен, что мой кластер Elasticsearch может обрабатывать более 3000 документов в секунду. Я думал, как-то разделить мультимап, который хранит документы json.

В любом случае я создаю специальное приложение для этого. Поэтому мне было интересно, есть ли какие-либо инструменты, которые можно собрать вместе, чтобы сделать все это? Либо какая-то форма ETL, либо обработка потока или что-то еще?

ответ

1

В то время как потоковая передача сделает записи более доступными, а затем массовую обработку и уменьшит накладные расходы в контейнере java для управления большими объектами, вы можете получить удар по задержке. Обычно в таких сценариях вы должны найти оптимальный размер для массового размера. В этом случае я выполняю следующие шаги:

1) Постройте поточную объемную вставку (так что поток, но все же получите более 1 записи (или создайте более 1 JSON в вашем случае в то время) 2) Экспериментируйте с несколькими массивами размеры: 10, 100, 1000, 10000, например, и выстроить их в быстрый график. Запустите достаточное количество записей, чтобы увидеть, не снизилась ли производительность с течением времени: может быть, что 10 очень быстро записывается на запись, но есть дополнительные затраты на вставку вставки (например, в SQL Server на обслуживание первичного ключа). Если вы используете одинаковое количество общих записей для каждого теста, оно должно быть репрезентативным для вашей работы. 3) Интерполируйте на своем графике и, возможно, попробуйте 3 значения между вашими лучшими значениями пробега 2

Затем используйте конечный результат в качестве оптимального размера вставки потока.

Как только у вас есть это значение, вы можете добавить еще один шаг: Провести несколько процессов параллельно. Затем это заполняет пробелы в процессе немного. Следите за пропускной способностью и настройте объемные размеры, возможно, еще раз.

Этот подход однажды помог мне с процессом импорта нескольких TB, чтобы ускорить от 2 дней до 12 часов, поэтому он может работать довольно позитивно.

+0

Да, я думаю, что я просто запустил приложение несколько раз: P Итак, каждый экземпляр приложения может читать разные диапазоны из таблиц БД. – user432024

+0

Это работает. В зависимости от того, как часто этот процесс используется, сбор некоторых данных о производительности может быть очень полезным. –

+0

Ну, я знаю, что для 3000 документов, время выглядит следующим образом ... Время, указанное ES, составляет 200-300 мс, а латентность передачи составляет около 400-500 мс. Таким образом, общее время обычно составляет менее 1 секунды. Я не стану сомневаться в производительности, а задаюсь вопросом, есть ли какие-либо существующие инструменты? Пока что пользовательский маршрут работает. Просто нужно создать приложение и сделать надежным и т. Д. В основном создавая многопоточную конвейерную систему, в которой он работает, но он перескакивал с полки. – user432024

Смежные вопросы