Галантерея 丨 Тест сравнения производительности DolphinDB и Elasticserach на наборах финансовых данных

Elasticsearch - очень популярный инструмент для поиска и анализа журналов, особенно с точки зрения масштабируемости, простоты использования и полнотекстового поиска в реальном времени. Есть статья о Чжиху , Голион: уменьшение размерности! Используйте ElasticSearch в качестве базы данных временных рядов и добились очень хороших результатов. Многие пользователи Zhihu не могут не спросить, можно ли использовать Elasticsearch для хранения и анализа больших финансовых данных?

По этой причине мы провели комплексные сравнительные тесты наборов финансовых данных разного масштаба между DolphinDB и Elasticsearch. Содержимое теста включает ввод-вывод, занятость дискового пространства, потребление памяти, запрос к базе данных (запрос фильтра и групповая статистика) 4 основных элемента. Результаты тестирования не вызывают сюрпризов: DolphinDB, база данных временных рядов, которая очень привлекает внимание в области обработки финансовых данных, превосходит Elasticsearch.

  • Групповая статистика (совокупный расчет), DolphinDB превосходит Elasticsearch  примерно в 10 раз, и преимущества становятся более очевидными по мере увеличения набора данных. В частности, когда тестовый пример включает поля типа времени, производительность DolphinDB особенно заметна.
  • Простой запрос фильтра, производительность DolphinDB в 100 раз выше , чем у Elasticsearch .
  • Что касается импорта данных, Elasticsearch занимает от 25 до 75 раз больше, чем DolphinDB , и имеет тенденцию к увеличению по мере увеличения набора данных.
  • Что касается занимаемого дискового пространства, DolphinDB достиг сжатия исходных данных, в то время как Elasticsearch занимает больше места на диске, чем исходные данные, чтобы поддерживать индекс документа и другую информацию (за исключением временных данных). Общий разрыв примерно в 10 раз.

1. Введение в систему

1.1 Введение в DolphinDB

DolphinDB - это аналитическая база данных распределенных временных рядов, использующая столбцовое хранилище, встроенный механизм обработки потоковых данных, параллельные вычисления и механизм распределенных вычислений, а также предоставляет распределенную файловую систему для поддержки расширения кластера. DolphinDB написан на C ++, и скорость отклика очень высока. Предоставьте языки сценариев, подобные SQL и Python, для управления данными. Предоставлять API на других широко используемых языках программирования для облегчения интеграции с существующими приложениями. Он хорошо работает в таких сценариях, как анализ и моделирование исторических данных, потоковая обработка данных в реальном времени в финансовой сфере, а также массовая обработка данных датчиков и анализ в реальном времени в области Интернета вещей.

1.2 Введение в Elasticsearch

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

Реляционная БД => Базы данных => Таблицы => Строки => Столбцы

Elasticsearch => Индексы => Типы => Документы => Поля

Кластер Elasticsearch может содержать несколько индексов (индексов), соответствующих базам данных DolphinDB; каждый индекс может содержать несколько типов (типов), соответствующих таблицам в DolphinDB; каждый тип содержит несколько документов (Documents), соответствующих данным DolphinDB. Строка; тогда каждый документ содержит несколько полей (Поля), соответствующих концепции столбцов в DolphinDB.

2. Конфигурация системы

2.1 Конфигурация оборудования

Аппаратная конфигурация этого теста следующая:

Оборудование: DELL OptiPlex 7060

ЦП: Inter (R) Core ™ i7-8700 CPU @ 3,20 ГГц, 6 ядер и 12 потоков

Память: 32 ГБ

Жесткий диск: механический жесткий диск 2 ТБ

Операционная система: Ubuntu 16.04 x64

2.2 Конфигурация среды

На этот раз тестовая среда представляет собой многоузловой кластер под одним сервером. Чтобы максимизировать производительность обоих в автономной среде, необходимо установить параметры узла для DolphinDB и Elasticsearch. Установите количество узлов данных DolphinDB равным 4 и установите максимальный доступный объем памяти для одного узла данных равным 7 ГБ. Установите количество узлов Elasticsearch равным 4. Поскольку Elasticsearch основан на Lucene, ему необходимо выделить определенный объем памяти для сегментов в Lucene, которые будут загружены в память, что также окажет большое влияние на производительность Elasticsearch. В этом тесте выделяется 8 Память ГБ предоставляется Lucene, а максимальный доступный объем памяти для одного узла в Elasticsearch установлен на 6 ГБ, и подкачка запрещена.

3. Набор тестовых данных

Для более полного тестирования производительности DolphinDB и Elasticsearch мы использовали три набора стандартных данных разного размера. Таблица данных CN_Stock содержит ежедневные данные о котировках акций Китая в Шанхае и Шэньчжэне с 2008.01.01 по 2017.12.31. Таблица данных US_Prices содержит ежедневные данные котировок на фондовом рынке США с 02 января 1990 г. по 30 декабря 2016 г. Таблица данных TAQ содержит часто встречающиеся данные уровня 1 фондового рынка США за 4 дня в августе 2007 г., всего 60,6 ГБ. Обзор набора тестовых данных показан в следующей таблице:

d0f5b2ac7fb475b20c61de31564ee331.png

Типы данных каждого поля в наборе тестовых данных в DolphinDB и Elasticsearch следующие:

(1) Отображение типа данных таблицы CN_Stock

edc651a7c632e97a2a3961fcd86c4795.png

(2) Отображение типов данных таблицы US_Prices

17e4aff6255d2bc11c4973b66b0d3405.png

(3) Отображение типов данных таблицы TAQ

5263427d6736b3ab2ea8ca44d9ea5b9b.png

4. Схема разделения / сегментирования

База данных DolphinDB предоставляет гибкие механизмы разделения, включая разделение по значениям, разделение по диапазону, разделение списка, разделение по хешу и комбинированное разделение, в то время как Elasticsearch поддерживает только механизмы сегментирования на основе хеша.

В DolphinDB для таблицы CN_Stock она делится на 20 секций по времени каждые шесть месяцев как секция; для таблицы US_Prices она делится на 27 секций по времени и году; для таблицы TAQ используется комбинация даты и биржевого кода. Всего 100 разделов. Количество копий установлено на 1.

Elasticsearch позволяет определять только количество шардов. Для таблиц CN_Stock и US_Prices количество фрагментов определено как 4; для таблицы TAQ количество фрагментов определено как 100. Количество копий установлено на 1.

5. Сравнительный тест

Мы сравнили DolphinDB и Elasticsearch с точки зрения производительности запросов к базе данных, производительности ввода-вывода, занимаемой площади на диске и потребления памяти.

5.1 Тест производительности запросов к базе данных

Язык сценариев DolphinDB поддерживает грамматику SQL, и в то же время он был в определенной степени расширен на ее основе, что сделало его более мощным. В Elasticsearch необходимо установить подключаемый модуль для запросов SQL-запросов. В то же время он также предоставляет для запросов язык DSL (Domain Specific Language) на основе формата данных JSON. В этом тесте используется язык DSL.

Основным сценарием приложения Elasticsearch является поисковая система, которая поддерживает нечеткие запросы. Для обычных запросов Elasticsearch возвращает только 10 совпадений по умолчанию; для агрегированных запросов размер возвращаемых сегментов по умолчанию также равен 10. Все результаты, возвращаемые каждым запросом в DolphinDB, являются результатами, и нет нечеткого запроса.

В запросе агрегирования Elasticsearch в возвращаемых результатах есть поля doc_count_error_upper_bound и sum_other_doc_count, которые соответственно представляют потенциальные результаты агрегирования, которые не были возвращены в этом агрегировании, но могут существовать, и количество документов, которые не были учтены в этом агрегировании. Это также хорошее доказательство того, что операция запроса данных Elasticsearch по умолчанию выполняет нечеткие запросы только к части данных в базе данных, а не точно запрашивает все записи данных в базе данных. Чтобы протестировать их в честной среде, нам нужно отключить нечеткий запрос Elasticsearch. Метод обработки заключается в использовании интерфейса прокрутки в Elasticsearch и определении размера сегментов для управления Elasticsearch, чтобы возвращать все результаты запроса.

В этом тесте сценарий DolphinDB использовался для выполнения теста производительности запросов DolphinDB. Используйте скрипт Python + DSL для выполнения теста производительности запросов Elasticsearch.

Мы выполнили несколько общих SQL-запросов к трем таблицам данных. Чтобы уменьшить влияние случайных факторов на результаты, этот тест производительности запроса выполнял 10 запросов для каждой операции запроса, а затем усреднял общее время с временем в миллисекундах. Сценарии тестирования и результаты каждого набора тестовых данных показаны в следующей таблице.

(1) таблица CN_Stock

Скрипт запроса в DolphinDB:

6756419a0c03a5ee21e51bd8a5cbc658.png

Результаты теста производительности запроса (объем данных: 5,332,932):

436170aa8845c219b5128a73fa43a220.png

(2) Цены в США 表

Скрипт запроса в DolphinDB:

01ba3e111169beef1ef7d7a4e129598f.png

Результаты тестирования производительности запроса (объем данных: 50 591 907):

fd2f704f5f6deb9da2b65228aca4437c.png

(3) Таблица TAQ

Скрипт запроса в DolphinDB:

90afe4dfa45bbc6f5fdd391726f4c350.png

Результаты тестирования производительности запроса (объем данных: 1366 036 384):

14edd7ea437fa80c1932d70278097e00.png

Для этого теста производительности запроса мы можем сделать следующие выводы:

(1) Во всех тестах на одной и той же таблице производительность DolphinDB во много раз превосходит Elasticsearch. В частности, для простых запросов с фильтрацией производительность DolphinDB составляет от 1 до 2 порядков производительности Elasticsearch (см. Результаты тестов в таблицах 1–4 CN_Stock и результаты тестов в таблицах 1–4 US_Prices).

(2) По результатам тестирования, относящимся к запросам агрегирования, производительность DolphinDB также лучше, чем Elasticsearch, в среднем в 8-9 раз. В частности, в агрегированном запросе, сгруппированном по времени, производительность DolphinDB в 13 ~ 15 раз выше, чем у Elasticsearch (см. 5 ~ 10 в результате теста таблицы CN_Stock и 5 ~ 10 в результате теста таблицы US_Prices).

(3) В одном и том же тесте запроса с разными масштабами данных мы видим, что по мере увеличения масштаба данных трудоемкий рост точного запроса Elasticsearch намного больше, чем у DolphinDB, а DolphinDB имеет отличную стабильность при различных масштабах данных. В Elasticsearch.

5.2 Тест производительности ввода / вывода

Elasticsearch предоставляет _bulk API для пакетной записи данных. При создании нового документа вам сначала необходимо описать атрибуты, типы данных (например, ключевое слово, текст, целое число или дата) каждого поля, которое может содержаться в документе, и указать, должны ли эти поля индексироваться или храниться в Lucene. Затем Elasticsearch создает соответствующее сопоставление для этих атрибутов документа и создает инвертированный индекс для формирования сегмента в Lucene. Наконец, инвертированный индекс сохраняется на диске с помощью механизма обновления и очистки. Процесс сброса инвертированного индекса из памяти на диск является ключом к определению производительности Elasticsearch. Стоит отметить, что хотя Elasticsearch предоставляет _bulk API для пакетного импорта данных, вы также можете установить index.refresh_interval = -1 и index. Number_of_replicas = 0 для оптимизации импорта. Однако в случае крупномасштабного импорта данных, когда буфер в памяти заполнен, обновление все равно будет запускаться, и будет выполняться очистка для сохранения данных на диске, поэтому эффект оптимизации не очень очевиден. Импорт данных Elasticsearch выполняется медленно. Очень существенные недостатки.

При создании таблицы распределенных данных в DolphinDB и записи данных сначала определите расположение узла данных, где записываются данные различных разделов, в соответствии с типом раздела таблицы распределенных данных. Внутри раздела данные организованы в хранилище по столбцам, а такие операции, как импорт и запрос данных, выполняются посредством взаимодействия между узлами.Импорт данных выполняется быстро, а производительность чрезвычайно высока.

В следующей таблице представлены результаты теста производительности ввода-вывода для двух импортируемых данных. Можно четко заметить, что коэффициент времени загрузки ES / DDB увеличивается с увеличением объема данных, особенно когда объем данных составляет 60,6 ГБ. В то время импорт Elasticsearch занимал более 12 часов. См. Приложение для сценария импорта данных.

ea90aa95abae6e10fb01ac395454398b.png

5.3 Тест дискового пространства

Elasticsearch известен своей эффективностью и своевременностью поиска. Это распределенная поисковая система, основанная на Lucene, сжимающая содержимое исходного поля, но внутри она строит инвертированный индекс для каждого созданного документа и сохраняет инвертированный индекс на диске. Поскольку к каждому документу на диске необходимо добавлять дополнительную индексную информацию, для его хранения требуется больше места. DolphinDB не нуждается в остальной информации индекса, и он действительно сжимает и сохраняет исходные данные. Результаты тестирования представлены в таблице ниже.

2557fe46c107b1a6cc5893a859ffed43.png

5.4 Использование памяти

Для более полного наблюдения за использованием памяти DolphinDB и Elasticsearch используйте команду Linux htop для отслеживания использования памяти DolphinDB и Elasticsearch (общий размер памяти составляет 32 ГБ). Результаты следующие:

ecdf4d33bde2a2fbe0179bd3006d8f26.png

5.5 Сравнение в других аспектах

(1) Elasticsearch поддерживает язык SQL благодаря необходимости установки подключаемого модуля, а его встроенный язык DSL представляет собой формат JSON со сложным синтаксисом. DolphinDB имеет встроенный полный язык сценариев, который не только поддерживает язык SQL, но также поддерживает императивные, векторизованные, функциональные, метапрограммированные, RPC и другие парадигмы программирования, которые позволяют легко реализовать больше функций.

(2) Основная цель Elasticsearch - предоставить механизм полнотекстового поиска с распределенными многопользовательскими возможностями, поддерживающий нечеткие запросы, документы (строки) не нуждаются в фиксированной структуре, а разные документы могут иметь разные наборы полей. DolphinDB поддерживает только структурированные данные.

(3) DolphinDB предоставляет более 600 встроенных функций для удовлетворения потребностей различных сценариев, таких как моделирование исторических данных и обработка потоковых данных в реальном времени в финансовой сфере, а также мониторинг в реальном времени, а также анализ и обработка данных в реальном времени в области Интернета вещей. Он обеспечивает функции нескольких индикаторов, таких как опережение, отставание, окно накопления, скользящее окно и т. Д., Необходимых для обработки данных временных рядов, и был оптимизирован по производительности с отличной производительностью. Поэтому, по сравнению с Elasticsearch, DolphinDB имеет более применимые сценарии.

(4) Elasticsearch не поддерживает соединения таблиц при использовании в базах данных временных рядов DolphinDB не только поддерживает соединения таблиц, но также оптимизирует методы неодновременного соединения, такие как соединение asof и соединение окон.

(5) DolphinDB поддерживает распределенные транзакции для записи данных, а Elasticsearch не поддерживает транзакции.

6. Резюме

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

Подробная информация о конфигурации DolphinDB и Elasticsearch, тестовый код DolphinDB и Elasticsearch, а также сценарий импорта данных показаны в приложении .


рекомендация

отblog.51cto.com/15022783/2576494