Clickhouse, Elasticsearch и Manticore: время поискового запроса с 1,7 млрд поездок на такси в Нью-Йорке

Clickhouse, Elasticsearch и Manticore: время поискового запроса с 1,7 млрд поездок на такси в Нью-Йорке

2 июня 2022 г.

Поездки на такси в Нью-Йорке (NYC), вероятно, являются наиболее часто используемым ориентиром в области анализа данных.


Все началось с того, что [Тодд В. Шнайдер] (https://toddwschneider.com/) решил подготовить коллекцию [впервые в 2015 году] (https://toddwschneider.com/posts/analyzing-1-1-billion-nyc- Taxi-and-uber-trips-with-a-vengeance/) для анализа 1,1 миллиарда поездок такси и Uber в Нью-Йорке. Затем [Марк Литвинчик] (https://tech.marksblogg.com/) продолжил тестирование [множества баз данных и поисковых систем] (https://tech.marksblogg.com/benchmarks.html), используя сбор данных.


Теперь мы в DB Benchmarks докеризованная подготовка сбора данных, чтобы упростить его использование, и сделать его доступным как часть наиболее прозрачного и [набора тестов баз данных с открытым исходным кодом] (https://github.com/db-benchmarks/db-benchmarks).


Сбор данных


Сбор данных охватывает 1,7 миллиарда поездок на такси и арендованных транспортных средствах (Uber, Lyft и т. д.) из Нью-Йорка с 2009 года. Большинство [необработанных данных] (https://www1.nyc.gov/site/tlc /about/tlc-trip-record-data.page) предоставлено Комиссией по такси и лимузинам Нью-Йорка.


Запись сбора данных включает множество различных атрибутов поездки на такси:


  • Дата и время получения

  • Координаты посадки и высадки

  • Названия мест посадки и высадки

  • Комиссия и сумма чаевых

  • Скорость ветра, глубина снега

  • И многие другие поля

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


Весь список полей и их типов данных:


"характеристики": {


"vendor_id": {"тип": "ключевое слово"},


"pickup_datetime": {"тип": "дата", "формат": "эпоха_секунда"},


"dropoff_datetime": {"тип": "дата", "формат": "эпоха_секунда"},


"store_and_fwd_flag": {"тип": "ключевое слово"},


"rate_code_id": {"тип": "целое число"},


"pickup_longitude": {"тип": "плавающий"},


"pickup_latitude": {"тип": "плавающий"},


"dropoff_longitude": {"тип": "плавающий"},


"dropoff_latitude": {"тип": "плавающий"},


"passenger_count": {"тип": "целое число"},


"trip_distance": {"тип": "плавающий"},


"fare_amount": {"тип": "плавающая"},


"дополнительно": {"тип": "плавающий"},


"mta_tax": {"тип": "плавающий"},


"tip_amount": {"тип": "плавающая"},


"tolls_amount": {"тип": "плавающая"},


"eail_fee": {"тип": "плавающий"},


"improvement_surcharge": {"тип": "плавающий"},


"total_amount": {"тип": "с плавающей запятой"},


"payment_type": {"тип": "ключевое слово"},


"trip_type": {"тип": "byte"},


"пикап": {"тип": "ключевое слово"},


"dropoff": {"тип": "ключевое слово"},


"cab_type": {"тип": "ключевое слово"},


"дождь": {"тип": "поплавок"},


"snow_depth": {"тип": "плавающий"},


"снегопад": {"тип": "поплавок"},


"max_temp": {"тип": "байт"},


"min_temp": {"тип": "байт"},


"ветер": {"тип": "поплавок"},


"pickup_nyct2010_gid": {"тип": "целое число"},


"pickup_ctlabel": {"тип": "ключевое слово"},


"pickup_borocode": {"тип": "байт"},


"pickup_boroname": {"тип": "ключевое слово"},


"pickup_ct2010": {"тип": "ключевое слово"},


"pickup_boroct2010": {"тип": "ключевое слово"},


"pickup_cdeligibil": {"тип": "ключевое слово"},


"pickup_ntacode": {"тип": "ключевое слово"},


"pickup_ntaname": {"тип": "текст", "поля": {"сырье": {"тип":"ключевое слово"}}},


"pickup_puma": {"тип": "ключевое слово"},


"dropoff_nyct2010_gid": {"тип": "целое число"},


"dropoff_ctlabel": {"тип": "ключевое слово"},


"dropoff_borocode": {"тип": "байт"},


"dropoff_boroname": {"тип": "ключевое слово"},


"dropoff_ct2010": {"тип": "ключевое слово"},


"dropoff_boroct2010": {"тип": "ключевое слово"},


"dropoff_cdeligibil": {"тип": "ключевое слово"},


"dropoff_ntacode": {"тип": "ключевое слово"},


"dropoff_ntaname": {"тип": "текст", "поля": {"сырье": {"тип":"ключевое слово"}}},


"dropoff_puma": {"тип": "ключевое слово"}


Базы данных


На данный момент мы сделали этот тест доступным для 3 баз данных


  • Clickhouse — мощная база данных OLAP,

  • Elasticsearch — «движок поиска и аналитики» общего назначения,

  • Manticore Search — «база данных для поиска», альтернатива Elasticsearch.

Мы постарались внести как можно меньше изменений в настройки базы данных по умолчанию, чтобы не дать ни одному из них несправедливого преимущества


  • Clickhouse: [без настройки] (https://github.com/db-benchmarks/db-benchmarks/blob/main/tests/taxi/init), просто CREATE TABLE... ENGINE = MergeTree() ORDER BY id и стандартный образ докера clickhouse-server.

  • Elasticsearch: здесь, чтобы было справедливо сравнить с другими базами данных, которые мы [должны были помочь Elasticsearch] (https://github.com/db-benchmarks/db-benchmarks/blob/main/tests/taxi/es/logstash_tuned/ template.json) по:

  • позволить ему создать 32 осколка: ("number_of_shards": 32`), иначе он не сможет использовать ЦП с 32 ядрами на сервере, поскольку, как [сказано] (https://www.elastic.co/guide /en/elasticsearch/reference/current/size-your-shards.html#single-thread-per-shard) в официальном руководстве Elasticsearch «Каждый сегмент выполняет поиск в одном потоке ЦП».


  • образ докера [стандартный] (https://github.com/db-benchmarks/db-benchmarks/blob/main/docker-compose.yml)

  • Поиск Manticore также используется в виде [их собственного образа докера + предоставляемой ими библиотеки столбцов] (https://github.com/db-benchmarks/db-benchmarks/blob/main/docker-compose.yml):


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

Мы также настроили базы данных так, чтобы они не использовали внутренние кеши


  • Кликхаус:

  • SYSTEM DROP MARK CACHE, SYSTEM DROP UNCOMPRESSED CACHE, SYSTEM DROP COMPILED EXPRESSION CACHE [после каждого запроса] (https://github.com/db-benchmarks/db-benchmarks/blob/main/plugins/ кликхаус.php).

  • Эластичный поиск:

  • "index.queries.cache.enabled": false в его конфигурации


  • Для Manticore Search в конфигурационном файле:

  • qcache_max_bytes = 0

  • docstore_cache_size = 0

  • Операционная система:

  • делаем echo 3 > /proc/sys/vm/drop_caches; sync перед каждым новым запросом

Запросы


Запросы в основном представляют собой аналитические запросы, которые выполняют фильтрацию, сортировку и группировку. Мы также включили один полнотекстовый запрос:


"ВЫБЕРИТЕ количество (*) ИЗ такси, где pickup_ntaname = '0'",


"SELECT pickup_ntaname, count(*) c FROM Taxi GROUP BY pickup_ntaname ORDER BY c desc limit 20",


"SELECT cab_type, count(*) c FROM Taxi GROUP BY cab_type заказать c desc LIMIT 20",


"ВЫБЕРИТЕ количество пассажиров, среднее (общее количество) ОТ такси СГРУППИРОВАТЬ ПО количеству пассажиров по заказу по описанию LIMIT 20",


"ВЫБЕРИТЕ количество (*) ОТ такси, ГДЕ tip_amount > 1,5",


"ВЫБРАТЬ avg(tip_amount) FROM Taxi WHERE tip_amount > 1.5 AND tip_amount < 5",


"SELECT rain, avg(trip_distance) a FROM Taxi GROUP BY rain order by desc LIMIT 20",


"manticoresearch": "ВЫБЕРИТЕ * ИЗ такси, где соответствует ('гарлемский восток') LIMIT 20",


"clickhouse": "ВЫБЕРИТЕ * ИЗ такси, где соответствует (dropoff_ntaname, '(?i)\WHarlem\WEast\W') или соответствует (pickup_ntaname, '(?i)\WHarlem\WEast\W' ) ПРЕДЕЛ 20",


"elasticsearch": "ВЫБЕРИТЕ * ИЗ такси, где запрос('гарлем восток') LIMIT 20"


"ВЫБЕРИТЕ среднее (общая_сумма) ОТ такси, ГДЕ trip_distance = 5",


"ВЫБЕРИТЕ среднее (общая_сумма), количество (*) ОТ такси, ГДЕ trip_distance > 0 И trip_distance < 5",


"ВЫБЕРИТЕ количество (*) ИЗ такси, где pickup_ntaname != '0'",


"выберитеpassage_count, count(*) c из группы такси по порядкуpassage_count по c desc limit 20",


"выбрать дождь, count(*) c из группы такси по порядку дождя по c desc limit 20",


"ВЫБЕРИТЕ количество (*) из такси, где pickup_ntaname = 'Верхний Вест-Сайд'",


"ВЫБРАТЬ * из лимита такси 5",


"ВЫБЕРИТЕ количество (*) ОТ такси, ГДЕ tip_amount = 5",


"ВЫБЕРИТЕ среднее (общая_сумма) ИЗ такси"


Полученные результаты


Вы можете найти все результаты на странице результатов, выбрав «Тест: такси».


Помните, что единственной качественной метрикой является «Fast avg», поскольку она гарантирует низкий коэффициент вариации и большое количество запросов, выполняемых для каждого запроса . Остальные 2 («Самый быстрый» и «Самый медленный») предоставляются без гарантии, поскольку:


  • Самый медленный - результат одной попытки, в большинстве случаев самый первый самый холодный запрос. Несмотря на то, что мы очищаем кеш ОС перед каждым холодным запросом, его нельзя считать стабильным. Таким образом, он может использоваться в информационных целях и выделен серым цветом в приведенном ниже резюме.

  • Fastest — просто самый быстрый результат, в большинстве случаев он должен быть похож на метрику «Fast avg», но может быть более изменчивым от запуска к запуску.

Помните, что тесты, включая результаты, на 100% прозрачны, как и все в этом проекте, поэтому:


  • вы можете использовать [тестовую среду] (https://github.com/db-benchmarks/db-benchmarks), чтобы узнать, как они были созданы

  • и найдите необработанные результаты тестов в каталоге results.

В отличие от других менее прозрачных и менее объективных бенчмарков, мы не делаем никаких выводов, мы просто оставляем скриншоты результатов здесь:


Все три конкурента одновременно



Clickhouse против Elasticsearch



Поиск Manticore и Elasticsearch



Поиск Мантикоры против Clickhouse



Отказ от ответственности


Автор этого теста и тестовой среды является членом основной группы Manticore Search, и тест изначально был сделан для сравнения поиска Manticore с Elasticsearch, но, как показано выше, его можно проверить. в открытом исходном коде и самостоятельно запустив тот же тест Manticore Search не получил несправедливого преимущества, поэтому тест можно считать непредвзятым. Однако, если что-то отсутствует или неверно (т. е. необъективно) в тесте, не стесняйтесь делать запрос на вытягивание или проблему на [Github] (https://github.com/db-benchmarks/db-benchmarks). Ваше мнение оценено! Спасибо, что потратили свое время на чтение этого!


Также опубликовано здесь.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE