Данные о такси в Нью-Йорке
Этот датасет может быть получен двумя способами:
- импорт из сырых данных;
- скачивание готовых партиций.
Как импортировать сырые данные
См. https://github.com/toddwschneider/nyc-taxi-data и http://tech.marksblogg.com/billion-nyc-taxi-rides-redshift.html для описания набора данных и инструкций по загрузке.
После скачивания получится порядка 227 Гб несжатых данных в CSV файлах. Скачивание занимает порядка часа на 1 Гбит соединении (параллельное скачивание с s3.amazonaws.com утилизирует как минимум половину гигабитного канала). Некоторые файлы могут скачаться не полностью. Проверьте размеры файлов и скачайте повторно подозрительные.
Некоторые файлы могут содержать некорректные строки. Их можно скорректировать следующим образом:
Далее данные должны быть предобработаны в PostgreSQL. Будут сделаны выборки точек в полигонах (для установки соответствия точек на карте с районами Нью-Йорка) и объединение всех данных в одну денормализованную плоскую таблицу с помощью JOIN. Для этого потребуется установить PostgreSQL с поддержкой PostGIS.
При запуске initialize_database.sh
, будьте осторожны и вручную перепроверьте, что все таблицы корректно создались.
Обработка каждого месяца данных в PostgreSQL занимает около 20-30 минут, в сумме порядка 48 часов.
Проверить количество загруженных строк можно следующим образом:
(this is slightly more than 1.1 billion rows reported by Mark Litwintschik in a series of blog posts)
Данные в PostgreSQL занимают 370 Гб.
Экспорт данных из PostgreSQL:
Слепок данных создается со скоростью около 50 Мб в секунду. Во время создания слепка, PostgreSQL читает с диска со скоростью около 28 Мб в секунду. Это занимает около 5 часов. Результирующий tsv файл имеет размер в 590612904969 байт.
Создание временной таблицы в ClickHouse:
Она нужна для преобразование полей к более правильным типам данных и, если возможно, чтобы избавиться от NULL’ов.
Данные читаются со скоростью 112-140 Мб в секунду. Загрузка данных в таблицу типа Log в один поток заняла 76 минут. Данные в этой таблице занимают 142 Гб.
(Импорт данных напрямую из Postgres также возможен с использованием COPY ... TO PROGRAM
.)
К сожалению, все поля, связанные с погодой (precipitation...average_wind_speed) заполнены NULL. Из-за этого мы исключим их из финального набора данных.
Для начала мы создадим таблицу на одном сервере. Позже мы сделаем таблицу распределенной.
Создадим и заполним итоговую таблицу:
Это занимает 3030 секунд со скоростью около 428 тысяч строк в секунду.
Для более короткого времени загрузки, можно создать таблицу с движком Log
вместо MergeTree
. В этом случае загрузка отработает быстрее, чем за 200 секунд.
Таблица заняла 126 Гб дискового пространства.
Между прочим, на MergeTree можно запустить запрос OPTIMIZE. Но это не обязательно, всё будет в порядке и без этого.
Скачивание готовых партиций
Если вы собираетесь выполнять запросы, приведенные ниже, то к имени таблицы нужно добавить имя базы, datasets.trips_mergetree
.
Результаты на одном сервере
Q1:
0.490 секунд.
Q2:
1.224 секунд.
Q3:
2.104 секунд.
Q4:
3.593 секунд.
Использовался следующий сервер:
Два Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz, в сумме 16 физических ядер, 128 GiB RAM, 8x6 TB HD на программном RAID-5
Время выполнения — лучшее из трех запусков.
На самом деле начиная со второго запуска, запросы читают данные из кеша страниц файловой системы. Никакого дальнейшего кеширования не происходит: данные зачитываются и обрабатываются при каждом запуске.
Создание таблицы на 3 серверах:
На каждом сервере:
На исходном сервере:
Следующим запрос перераспределит данные:
Это занимает 2454 секунд.
На трёх серверах:
Q1: 0.212 секунд. Q2: 0.438 секунд. Q3: 0.733 секунд. Q4: 1.241 секунд.
Никакого сюрприза, так как запросы масштабируются линейно.
Также у нас есть результаты с кластера из 140 серверов:
Q1: 0.028 sec. Q2: 0.043 sec. Q3: 0.051 sec. Q4: 0.072 sec.
В этом случае, время выполнения запросов определяется в первую очередь сетевыми задержками. Мы выполняли запросы с помощью клиента, расположенного в другом дата-центре, не там где кластер, что добавляет порядка 20 мс задержки.
Резюме
серверов | Q1 | Q2 | Q3 | Q4 |
---|---|---|---|---|
1 | 0.490 | 1.224 | 2.104 | 3.593 |
3 | 0.212 | 0.438 | 0.733 | 1.241 |
140 | 0.028 | 0.043 | 0.051 | 0.072 |