Почему ClickHouse подходит для архитектуры данных Medallion и как реализовать это слоистое хранилище средствами колоночной СУБД без сторонних инструментов: лучшие практики и примеры использования.
3 слоя архитектуры данных Medallion
Слоистая архитектура, предложенная компанией Databricks, сегодня считается классикой для построения озер и хранилищ данных. Она предполагает реализацию 3-х уровней (слоев):
- Бронза, где хранятся необработанные (сырые) данные из исходных систем. По сути, это staging-зона, куда загружаются исходные данные из систем-источников с минимальными преобразованиями и дополнительными метаданными. Этот слой оптимизирован для быстрого приема и может предоставить исторический архив исходных данных, который всегда доступен для повторной обработки или отладки.
- Серебро, где данные с предыдущего слоя фильтруются, очищаются, дедуплицируются, обогащаются и приводятся в соответствие с единой схемой для точного и согласованного представления. Хотя эти данные уже могут быть использоваться для машинного обучения и аналитики, это не самый типичный случай. На этом слое качество данных не сильно улучшается, а, скорее повышается эффективность их запросов.
- Золото, где располагаются полностью готовые к использованию наборы данных для конечных потребителей: пользователей или аналитических приложений и систем отчетности. Обычно эти данные денормализованы и/или предварительно агрегированы для оптимальной производительности чтения и могут быть составлены из нескольких таблиц из предыдущего серебряного слоя. Основное внимание здесь уделяется применению окончательных преобразований и повышению качества результирующих данных.
Такой многоуровневый подход направлен на построение эффективного хранилища данных с обеспечением их высокого качества и целостности. Преобразуя данные постепенно, архитектура Medallion позволяет выстроить четкую историю происхождения данных и получить постепенно уточняющиеся датасеты для аналитики и машинного обучения.
Вспомнив, что представляет собой архитектура данных Medallion, далее рассмотрим, почему ClickHouse отлично подходит для реализации каждого из ее слоев.
Реализация бронзового слоя с ClickHouse
Будучи точкой входа в озеро или хранилище данных, бронзовый слой принимает пакеты или потоки из систем-источников. Данные могут быть загружены в этот слой напрямую через клиентов, ELT-инструменты, потреблением потоков из Kafka с помощью ClickPipes или коннектора ClickHouse Kafka. S3Queue и ClickPipes в ClickHouse Cloud предоставляют дополнительные возможности для инкрементального чтения данных из контейнеров AWS S3 в 70 различных форматах данных, включая Parquet и Iceberg. Использования AWS S3 в качестве промежуточной области особенно распространен при обработке больших полуструктурированных данных с не очень высокой согласованностью схемы.
При использовании ClickHouse бронзовый слой обычно реализуется с движком MergeTree, который разработан для эффективной обработки быстрых вставок. Схема таблицы и ключ сортировки повышают эффективность вставки и обеспечивают быстрое чтение, если данные необходимо воспроизвести на серебряный слой или исследовать их качество. Поскольку потребители не используют данные с бронзового слоя, рекомендуется оптимизировать ключ сортировки для эффективного полного сканирования данных, т.е. использовать столбец, соответствующий порядку чтения, которым обычно является отметка времени.
Благодаря наличию типа данных JSON в ClickHouse, на бронзовый слой можно передавать данные с различными схемами без необходимости обеспечивать их строгую согласованность. При этом можно применять правила фильтрации путей объектов. Материализованные столбцы обеспечивают эффективную обработку JSON-данных путем создания производных столбцов для часто запрашиваемых атрибутов. Это особенно полезно, когда JSON-данные включают нерегулярные пути или структуры, позволяя выполнять их базовую предварительную обработку без накладных расходов на полное принудительное применение схемы. Извлеченные столбцы обычно используются для последующей условной фильтрации.
Таблицы бронзового слоя можно разделить для оптимизации производительности запросов и обеспечения эффективного управления данными. Установив TTL для истечения срока действия старых данных, которые больше не требуются, можно повысить эффективность использования хранилища.
Серебряный слой
Серебряный слой представляет собой следующий этап архитектуры Medallion, преобразуя сырые данные из бронзового слоя в более последовательную и хорошо структурированную форму. Этот слой решает проблемы качества данных, такие как фильтрация невалидных строк, стандартизация схем и выполнение преобразований. В ClickHouse серебряный слой обычно заполняется с помощью инкрементных материализованных представлений (Incremental Materialized Views), примененных к таблицам бронзового слоя. Они выполняют запросы к вновь вставленным блокам данных в бронзовом слое, фильтруя и преобразуя данные, а также применяя нормализацию схемы перед записью результатов в таблицы серебряного слоя. Эти представления обеспечивают эффективное и непрерывное преобразование данных. Используя несколько представлений, можно создавать разные версии данных, каждая из которых нацелена на определенные таблицы серебряного слоя для различных вариантов использования в нисходящем направлении. Кроме того, невалидные или необрабатываемые строки могут быть перенаправлены в очередь недоставленных сообщений с помощью отдельных материализованных представлений, чтобы потом проверить и обработать их без потери данных.
Для дедупликации или обработки CDC-потоков можно использовать табличный движок таблиц ReplacingMergeTree. Ключ сортировки этого движка используется для выполнения дедупликации с уникальными наборами значений, идентифицирующими строку и с обновлениями версионных вставок, что особенно полезно в сценариях CDC. Движок ReplacingMergeTree выполняет дедупликацию во время слияния, поэтому является согласованным в конечном счете. Из-за этого необходимо использовать модификатор FINAL во время запроса, чтобы гарантировать отсутствие дубликатов в результатах.
Подобно бронзовому слою, таблицы серебряного слоя можно разделить для оптимизации производительности запросов и управления данными с помощью лимита TTL. Партиционирование может повысить производительность чтения из таблиц ReplacingMergeTree с FINAL. Хотя серебряный слой не является долгосрочным архивом, данные в нем обычно хранятся менее длительный период, чем в бронзовом и золотом слоях с соответствующим разделением.
Золотой слой
Золотой слой представляет собой финальный этап в архитектуре Medallion, где данные становятся полностью денормализованными и готовыми использованию конечными потребителями: бизнес-пользователями и аналитическими приложениями. Золотой слой заполняется данными из таблиц серебряного слоя с помощью обновляемых материализованных представлений, которые выполняют сложные преобразования, включая объединения и агрегации. Это гарантирует, что данные находятся в пригодной для использования форме, сокращая количество объединений и агрегаций во время запроса. Таблицы золотого слоя предназначены для высокой производительности с минимальной задержкой и максимальной эффективностью.
В отличие от инкрементных материализованных представлений, используемых для заполнения серебряного слоя, золотой слой заполняется обновляемыми материализованными представлениями (Refreshable Materialized Views). Эти представления периодически выполняются в отношении таблиц серебряного слоя и позволяют выполнять расширенные преобразования, такие как сложные соединения, которые денормализуют данные перед их записью в таблицы золотого слоя. При извлечении данных из таблиц серебряного слоя с использованием движка ReplacingMergeTree эти представления могут выполнять запросы с оператором FINAL, чтобы гарантировать полную дедупликацию перед вставкой данных в золотой слой. Это обеспечивает высокое качество данных, сохраняя гибкость обработки запросов.
Таблицы в золотом слое обычно реализуются с использованием движка MergeTree с ключами сортировки, специально оптимизированными для шаблонов доступа нижестоящих приложений. Эти денормализованные датасеты структурированы для сокращения дополнительных соединений, чтобы повысить скорость и эффективность чтения для инструментов отчетности, аналитики и дашбордов. В дополнение к хранению денормализованных датасетов, золотой слой часто включает в себя интерементальные материализованные представления для предварительного вычисления агрегаций. Эти представления выполняют группировку с оператором GROUP BY на новых вставках в таблицы золотого слоя, записывая промежуточные результаты агрегации в целевые таблицы с помощью движка AggreatingMergeTree. Это значительно ускоряет выполнение запросов.
Таким образом, архитектура Medallion, реализованная с помощью ClickHouse, предлагает структурированный подход к управлению конвейерами данных посредством многоуровневых преобразований. Благодаря поддержке более 70 форматов файлов сырые данные могут быть напрямую загружены в бронзовый слой с помощью функций s3Queue или ClickPipe в ClickHouse Cloud, а затем постепенно уточнены и обогащены в серебряном слое и, наконец, представлены в золотом слое для оптимального потребления бизнес-пользователями и аналитическими приложениями. Используя таблицы движка MergeTree, инкрементные и обновляемые материализованные представления и поддержку различных форматов файлов, архитектура Medallion в ClickHouse обеспечивает прием, преобразование и доставку данных без использования внешних инструментов.
Разумеется, помимо преимуществ, архитектура Medallion имеет и недостатки. В частности, таблицы золотого слоя по своей сути представляют одни и те же данные многими способами, каждый из которых оптимизирован для своего потребителя, что приводит дублированию данных. Затраты на эту репликацию можно снизить за счет использования объектного хранилища для таблиц MergeTree с разделением хранения и вычислений. Кроме того, архитектура требует управления несколькими уровнями, что вносит дополнительную сложность в конвейеры данных. Это требует мониторинга, который можно осуществить с помощью системных таблиц ClickHouse , которые обеспечивают видимость состояния материализованных представлений и процессов миграции данных. Дополнительные инструменты мониторинга, такие как Grafana, могут оповещать о проблемах расхождения данных.
Кроме того, слоистый характер архитектуры Medallion вносит задержку в доступность данных из-за их систематического перемещения по слоям. Поэтому такую архитектуру сложнее оптимизировать в сценариях реального времени, где критична доступность данных с минимальной задержкой. Эти выводы подтверждает кейс социальной сети Bluesky, дата-инженеры которой построили корпоративное хранилище данных с архитектурой Medallion на базе ClickHouse.
Освойте ClickHouse на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники