Почему стоит использовать ClickHouse Cloud вместо BigQuery?
Загрузка данных из BigQuery в ClickHouse Cloud
Датасет
post, vote, user, comment и badge, появившиеся на Stack Overflow с 2008 года по апрель 2024 года. Схема BigQuery для этих данных показана ниже:
Для пользователей, которые хотят загрузить этот датасет в экземпляр BigQuery, чтобы протестировать шаги миграции, мы предоставили данные для этих таблиц в формате Parquet в бакете GCS, а команды DDL для создания и загрузки таблиц в BigQuery доступны здесь.
Миграция данных
- Первоначальная пакетная загрузка с периодическими обновлениями — необходимо перенести исходный датасет вместе с периодическими обновлениями через фиксированные интервалы, например ежедневно. Обновления в этом случае выполняются повторной отправкой изменённых строк, определяемых по столбцу, который можно использовать для сравнения (например, по дате). Удаления обрабатываются периодической полной перезагрузкой датасета.
- Репликация в реальном времени или CDC — необходимо перенести исходный датасет. Изменения в этом датасете должны отражаться в ClickHouse почти в реальном времени, при этом допустима задержка всего в несколько секунд. По сути, это процесс CDC (фиксации изменений данных), при котором таблицы в BigQuery должны быть синхронизированы с ClickHouse, то есть вставки, обновления и удаления в таблице BigQuery должны применяться к эквивалентной таблице в ClickHouse.
Пакетная загрузка через Google Cloud Storage (GCS)
- Экспортируйте 7 таблиц в GCS. Команды для этого доступны здесь.
-
Импортируйте данные в ClickHouse Cloud. Для этого можно использовать табличную функцию gcs. DDL и запросы для импорта доступны здесь. Обратите внимание: поскольку экземпляр ClickHouse Cloud состоит из нескольких вычислительных узлов, вместо табличной функции
gcsмы используем табличную функцию s3Cluster. Эта функция также работает с бакетами GCS и задействует все узлы сервиса ClickHouse Cloud, чтобы загружать данные параллельно.
- Функция экспорта BigQuery поддерживает фильтрацию и позволяет экспортировать подмножество данных.
- BigQuery поддерживает экспорт в форматы Parquet, Avro, JSON и CSV, а также несколько типов сжатия — все они поддерживаются ClickHouse.
- GCS поддерживает управление жизненным циклом объектов, что позволяет удалять данные, уже экспортированные и импортированные в ClickHouse, через заданный период времени.
- Google позволяет бесплатно экспортировать в GCS до 50 ТБ в день. Пользователи платят только за хранение в GCS.
- При экспорте автоматически создается несколько файлов, при этом размер каждого ограничен 1 ГБ табличных данных. Это выгодно для ClickHouse, поскольку позволяет распараллелить импорт.
Репликация в реальном времени или CDC через запросы по расписанию
Проектирование схем
posts. Схема BigQuery для нее показана ниже:
Оптимизация типов
INSERT INTO SELECT, считав экспортированные данные из gcs с помощью табличной функции gcs. Обратите внимание: в ClickHouse Cloud вы также можете использовать совместимую с gcs табличную функцию s3Cluster, чтобы распараллелить загрузку на нескольких узлах:
Чем первичные ключи в ClickHouse отличаются?
- Эффективное использование памяти и диска критически важно для тех масштабов, на которых часто применяется ClickHouse. Данные записываются в таблицы ClickHouse фрагментами, называемыми частями, а затем к этим частям в фоновом режиме применяются правила слияния. В ClickHouse у каждой части есть собственный первичный индекс. Когда части сливаются, первичные индексы также объединяются в индекс слитой части. При этом эти индексы строятся не для каждой строки. Вместо этого первичный индекс части содержит одну запись индекса на группу строк — этот подход называется разреженной индексацией.
- Разреженная индексация возможна потому, что ClickHouse хранит строки каждой части на диске в порядке, заданном указанным ключом. Вместо прямого поиска отдельных строк (как в индексе на основе B-Tree) разреженный первичный индекс позволяет быстро — с помощью двоичного поиска по записям индекса — определить группы строк, которые потенциально могут соответствовать запросу. Затем найденные группы потенциально подходящих строк параллельно передаются в движок ClickHouse для поиска совпадений. Такая структура индекса позволяет сделать первичный индекс компактным (он полностью помещается в оперативную память) и при этом существенно ускорить выполнение запросов, особенно диапазонных запросов, типичных для аналитики данных. Подробнее см. в этом подробном руководстве.
Все столбцы в таблице будут отсортированы по значению указанного ключа сортировки, независимо от того, входят ли они в сам ключ. Например, если в качестве ключа используетсяCreationDate, порядок значений во всех остальных столбцах будет соответствовать порядку значений в столбцеCreationDate. Можно указать несколько ключей сортировки — в этом случае порядок будет задаваться с той же семантикой, что и в секцииORDER BYзапросаSELECT.
Выбор ключа сортировки
Методы моделирования данных
Партиции
PARTITION BY. Это предложение может содержать SQL-выражение по одному или нескольким столбцам, результат которого определяет, в какую партицию будет направлена строка.
Части данных на диске логически связаны с каждой партицией и могут запрашиваться по отдельности. В приведенном ниже примере мы партиционируем таблицу posts по году с помощью выражения toYear(CreationDate). По мере вставки строк в ClickHouse это выражение будет вычисляться для каждой строки, после чего строки будут направляться в соответствующую партицию в виде новых частей данных, принадлежащих этой партиции.
Применение
- Управление данными - В ClickHouse партиционирование следует прежде всего рассматривать как средство управления данными, а не как метод оптимизации запросов. Благодаря логическому разделению данных по ключу с каждой партицией можно работать независимо, например удалять её. Это позволяет эффективно перемещать партиции, а значит и подмножества данных, между уровнями хранения по времени или удалять устаревшие данные/эффективно удалять из кластера. В примере ниже мы удаляем посты за 2008 год:
- Оптимизация запросов - Хотя партиции могут помочь повысить производительность запросов, это сильно зависит от шаблонов доступа. Если запросы затрагивают лишь несколько партиций (в идеале одну), производительность может улучшиться. Обычно это имеет смысл только в том случае, если ключ партиционирования не входит в первичный ключ, а фильтрация выполняется по нему. Однако запросы, которым нужно охватить много партиций, могут работать хуже, чем без партиционирования (поскольку из-за партиционирования может образовываться больше частей). Преимущество от обращения к одной партиции будет ещё менее заметным, вплоть до полного отсутствия, если ключ партиционирования уже входит в число первых полей первичного ключа. Партиционирование также можно использовать, чтобы оптимизировать запросы
GROUP BY, если значения в каждой партиции уникальны. Однако в целом следует убедиться, что первичный ключ оптимизирован, и рассматривать партиционирование как способ оптимизации запросов только в исключительных случаях, когда шаблоны доступа предполагают обращение к определённому предсказуемому подмножеству данных за день, например при партиционировании по дням, когда большинство запросов выполняется по данным за последний день.
Рекомендации
ORDER BY.
В ClickHouse создаются части для вставляемых данных. По мере вставки новых данных количество частей растет. Чтобы не допустить чрезмерного увеличения числа частей, которое ухудшает производительность запросов (поскольку приходится читать больше файлов), части объединяются в фоновом асинхронном процессе. Если число частей превышает заранее заданный предел, ClickHouse сгенерирует исключение при вставке в виде ошибки “too many parts”. В нормальном режиме работы этого происходить не должно; такое случается только при неправильной конфигурации ClickHouse или некорректном использовании, например при большом количестве мелких вставок. Поскольку части создаются изолированно для каждой партиции, увеличение числа партиций приводит и к увеличению числа частей, то есть число частей становится кратным числу партиций. Поэтому ключи партиционирования с высокой мощностью могут вызывать эту ошибку, и их следует избегать.
Materialized views и проекции
ORDER BY.
В разделе моделирование данных в ClickHouse мы рассматриваем, как materialized view можно использовать
в ClickHouse для предварительного вычисления агрегаций, преобразования строк и оптимизации запросов
для разных сценариев доступа к данным. В последнем случае мы привели пример, где
materialized view отправляет строки в целевую таблицу с другим ключом сортировки,
чем у исходной таблицы, принимающей вставки.
Например, рассмотрим следующий запрос:
UserId не является ключом сортировки. Ранее
мы решали эту задачу с помощью materialized view, используемого для поиска по PostId. Ту же проблему можно решить с помощью проекции.
Приведённая ниже команда добавляет проекцию с ORDER BY user_id.
ALTER, то после выполнения команды
MATERIALIZE PROJECTION её создание происходит асинхронно. Вы можете проверить ход
этой операции с помощью следующего запроса, дождавшись is_done=1.
EXPLAIN мы также можем подтвердить, что для выполнения этого запроса использовалась проекция:
Когда использовать проекции
- Требуется полное переупорядочивание данных. Хотя выражение в проекции теоретически может использовать
GROUP BY,materialized view лучше подходят для поддержки агрегатов. Оптимизатор запросов также с большей вероятностью будет использовать проекции, в которых применяется простое переупорядочивание, то естьSELECT * ORDER BY x. В этом выражении можно выбрать подмножество столбцов, чтобы уменьшить объем хранимых данных. - Пользователей устраивает связанное с этим увеличение объема хранилища и дополнительные накладные расходы из-за двукратной записи данных. Проверьте влияние на скорость вставки и оцените дополнительные затраты на хранение.
Как переписать запросы BigQuery в ClickHouse
ClickHouse
Агрегатные функции
функции argMax определить самый просматриваемый вопрос для каждого года.
BigQuery
ClickHouse
Условные выражения и массивы
HAVING и SELECT.
BigQuery
ClickHouse