Создание архитектуры Medallion с помощью ClickHouse

Перевод статьи: Building a Medallion architecture with ClickHouse

Table of Contents

Построение архитектуры Medallion с использованием ClickHouse

Крупномасштабная обработка данных требует эффективной структуризации, трансформации и анализа наборов данных. Архитектура Medallion — это шаблон проектирования рабочего процесса данных для организации и повышения их качества посредством поэтапных преобразований, который широко используется для управления сложными наборами данных. Обычно она реализуется с помощью инструментов, таких как Spark и Delta Lake, и позволяет систематически очищать «сырой», неструктурированный набор данных до состояния, пригодного для анализа и прикладных приложений.

В этом посте мы исследуем, как архитектура Medallion может быть полностью реализована с использованием нативных конструкций ClickHouse, что устраняет необходимость во внешних фреймворках или инструментах. Благодаря высокой производительности запросов, поддержке широкого спектра форматов данных и встроенным функциям для управления и преобразования данных, ClickHouse можно эффективно использовать на каждом этапе этой архитектуры.

Цель этого поста — показать, как три этапа архитектуры Medallion могут быть теоретически реализованы с помощью ClickHouse.

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

Что такое архитектура Medallion?

Архитектура Medallion — это широко используемый рабочий процесс обработки данных, который организует данные в многоуровневую структуру, где качество данных постепенно улучшается по мере их прохождения через этапы. Хотя она широко применяется в озёрах данных (data lake houses), эту архитектуру также можно использовать в режиме реального времени в хранилищах данных для обеспечения эффективного управления и трансформации данных.

Архитектура включает три слоя (или этапа), каждый из которых выполняет определённые задачи в процессе обработки данных:

Bronze слой

Этот слой служит зоной приёма для сырых, необработанных данных непосредственно из исходной системы — своего рода «зона промежуточного хранения». Данные хранятся в их оригинальной структуре с минимальными преобразованиями и дополнительными метаданными. Этот слой оптимизирован для быстрой загрузки данных и может служить историческим архивом исходных данных, которые всегда доступны для повторной обработки или отладки.

Следует ли хранить все данные в бронзовом слое — вопрос спорный. Некоторые пользователи предпочитают фильтровать данные и применять преобразования, например, упрощение JSON, переименование полей или отсеивание некорректных данных. Мы не занимаем жёсткую позицию, но рекомендуем оптимизировать хранение для использования только серебряным слоем, а не другими потребителями.

Silver слой

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

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

Gold слой

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

Этот многоуровневый подход к обработке данных нацелен на эффективное решение таких проблем, как качество данных, дублирование и несоответствия в схемах. Постепенно преобразуя необработанные данные, архитектура Medallion обеспечивает чёткую родословную данных и их последовательное улучшение, чтобы они были готовы к анализу или операционному использованию.

Хотя мы считаем, что название «архитектура медальонов» могло бы лучше отражать содержание её уровней, полезные процессы и дисциплина, которую она способствует, делают её ценной.

Архитектура Medallion с использованием ClickHouse

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

Bronze слой с использованием ClickHouse

Bronze слой служит точкой входа для сырых, необработанных данных, оптимизированных для высокоскоростной загрузки с использованием гибких и производительных конструкций ClickHouse. Этот слой может также выполнять функцию исторического архива, сохраняя необработанные данные для их родословной, отладки или повторной обработки без необходимости в полном очищении или удалении дубликатов на начальном этапе. Такой акцент на производительность и гибкость создаёт надёжную основу для дальнейшей обработки и преобразования данных на следующих этапах.

Основные характеристики Bronze слоя при использовании ClickHouse.

Загрузка данных из источников

Данные могут загружаться в этот слой напрямую через клиенты, ELT-инструменты, такие как Fivetran, или потоки из Kafka с использованием ClickPipes или коннектора Kafka для ClickHouse. В ClickHouse Cloud доступны дополнительные возможности для построчного чтения данных из S3-хранилищ через S3Queue и ClickPipes, поддерживающих более 70 форматов данных (включая сжатые), таких как Parquet и форматы для озёр данных, например Iceberg. Подход с использованием S3 как зоны промежуточного хранения особенно часто применяется при обработке больших полуструктурированных данных с менее согласованной схемой.

Оптимизация для быстрой вставки

Bronze слой, как правило, реализуется с использованием MergeTree, который разработан для эффективной обработки быстрых вставок. Схема таблицы и ключ упорядочивания настраиваются для оптимизации операций вставки, а также для обеспечения высокой производительности чтения в случае необходимости повторной обработки данных (для Silver слоя) или их анализа на предмет проблем с качеством. Учитывая, что этот слой не предназначен для конечных потребителей, мы рекомендуем оптимизировать ключ упорядочивания для эффективного полного сканирования данных, например, использовать ключ, соответствующий порядку чтения — обычно по времени.

Поддержка полуструктурированных данных в формате JSON

Новый тип JSON в ClickHouse является ключевой функцией для обработки полуструктурированных данных в Bronze слое. Этот тип позволяет загружать данные с динамическими и непредсказуемыми схемами без необходимости строгого соблюдения структуры на этапе загрузки, что особенно ценно для наборов данных с несогласованными или изменяющимися структурами. Благодаря поддержке динамического JSON Bronze слой становится эффективной зоной приёма необработанных данных, способной обрабатывать сценарии, где согласованность схемы не гарантирована. Обратите внимание, что тип JSON позволяет применять фильтры с контролем, какие пути объектов сохраняются. Пользователи также могут отфильтровывать некорректные JSON перед сохранением в этом слое и, при необходимости, упрощать сложные структуры.

Использование этого типа данных не ограничивается Bronze слоем, так как он может быть полезен и на других уровнях, например, для колонок с динамическими схемами, таких как пользовательские теги.

Материализованные колонки для базовой обработки

Материализованные колонки предоставляют мощный механизм для извлечения и преобразования определённых полей во время загрузки данных. Хотя их возможности ограничены, они позволяют эффективно обрабатывать JSON-данные, создавая производные колонки для часто запрашиваемых атрибутов. Такой подход особенно полезен, если JSON-данные включают нерегулярные пути или структуры, что позволяет выполнять базовую предварительную обработку без необходимости полного соблюдения схемы. Эти извлечённые колонки также часто используются для последующей фильтрации.

Партиционирование и управление хранением данных

Таблицы Bronze слоя могут быть разделены на партиции для оптимизации производительности запросов и обеспечения эффективного управления данными. Рекомендуется использовать правила TTL для автоматического удаления устаревших данных, которые больше не нужны, что способствует соответствию требованиям и эффективному использованию хранилища.

Silver слой с использованием ClickHouse

Silver слой представляет следующий этап в рабочем процессе Medallion, преобразуя сырые данные из Bronze слоя в более согласованную и структурированную форму. Этот уровень решает проблемы качества данных, такие как фильтрация некорректных строк, стандартизация схем и выполнение преобразований. В ClickHouse обычно используется прямое сопоставление таблиц Bronze слоя с их эквивалентами в Silver, но с очищенным и обогащённым набором данных, который служит основой для дальнейшей обработки в Gold слое.

Инкрементальные материализованные представления

Silver слой, как правило, заполняется с использованием инкрементальных материализованных представлений, привязанных к таблицам Bronze слоя. Эти представления выполняют запросы на новых блоках данных, добавленных в Bronze слой, применяя фильтрацию, преобразования и нормализацию схемы перед записью результатов в таблицы Silver слоя для сохранения. Такие представления позволяют эффективно и непрерывно преобразовывать данные, а при использовании нескольких представлений пользователи могут создавать разные версии данных, каждая из которых предназначена для определённых таблиц Silver слоя с учётом конкретных задач. Кроме того, некорректные или необрабатываемые строки могут быть перенаправлены в очередь «мертвых писем» (dead letter queue) через отдельные материализованные представления, что позволяет их проверить и, возможно, восстановить, не засоряя основной набор данных.

Обработка дублирования и CDC

Для сценариев, требующих удаления дубликатов или обработки потоков Change Data Capture (CDC), можно использовать движок таблиц ReplacingMergeTree. Ключ упорядочивания этого движка используется для выполнения удаления дубликатов (с уникальными наборами значений, идентифицирующими строку), причём обновления обрабатываются как версионные вставки — это особенно полезно в сценариях CDC. Обратите внимание, что ReplacingMergeTree выполняет удаление дубликатов во время слияния данных, поэтому он обеспечивает только возможную согласованность, требуя использования оператора FINAL при запросах, чтобы гарантировать отсутствие дубликатов в результатах. В общем случае мы рекомендуем конечным приложениям осторожно обращаться к этому слою, так как использование FINAL может значительно увеличить время выполнения запросов.

Партиционирование и управление хранением данных

Аналогично Bronze слою, таблицы Silver слоя могут быть разделены на партиции для оптимизации производительности запросов и управления данными с использованием TTL. Партиционирование также может улучшить производительность при чтении из таблиц ReplacingMergeTree с использованием FINAL. Мы рекомендуем следовать лучшим практикам, таким как оптимизация операций слияния, чтобы поддерживать высокую производительность. Так как этот слой не является долгосрочным архивом и может не использоваться в качестве источника для последующих этапов, данные могут храниться в этом слое более короткий период, чем в Bronze и Gold слоях, с более короткими интервалами партиционирования.

Gold слой с использованием ClickHouse

Gold слой представляет заключительный этап архитектуры Medallion, где данные преобразуются в полностью денормализованные, готовые для бизнеса наборы данных, оптимизированные для использования конечными приложениями и аналитикой. Этот слой заполняется из Silver слоя с использованием обновляемых материализованных представлений, выполняющих сложные преобразования, включая соединения и агрегации. Это обеспечивает максимально удобную для использования форму данных, сводя к минимуму необходимость в объединениях и даже агрегациях на этапе выполнения запросов. Таблицы Gold слоя разрабатываются для обеспечения высокой производительности, поддерживая конечные приложения с минимальной задержкой и максимальной эффективностью.

Обновляемые материализованные представления

В отличие от инкрементальных материализованных представлений, используемых для заполнения Silver слоя, Gold слой заполняется с помощью обновляемых материализованных представлений. Эти представления выполняются периодически для таблиц Silver слоя и позволяют выполнять продвинутые преобразования, такие как сложные объединения, денормализуя данные перед их записью в таблицы Gold слоя. При использовании данных из таблиц Silver слоя с движком ReplacingMergeTree, эти представления могут выполнять запросы с оператором FINAL, чтобы гарантировать вставку полностью очищенных от дубликатов данных в Gold слой. Такой подход обеспечивает наивысшее качество данных, сохраняя при этом гибкость для выполнения сложных запросов.

Проектирование таблиц для конечных приложений

Таблицы в Gold слое обычно реализуются с использованием стандартных таблиц MergeTree, где ключи упорядочивания оптимизируются специально под шаблоны доступа конечных приложений. Эти денормализованные наборы данных структурированы таким образом, чтобы минимизировать необходимость в дополнительных объединениях, что позволяет приложениям выполнять быстрые и эффективные запросы. Адаптация схемы и ключей к требованиям пользовательских запросов обеспечивает бесшовную интеграцию с инструментами отчётности, аналитическими панелями и интерактивными интерфейсами.

Инкрементальные материализованные представления для предвычисленных агрегаций

Помимо хранения денормализованных наборов данных, Gold слой часто включает инкрементальные материализованные представления для предвычисления агрегаций. Эти представления выполняют запросы с использованием GROUP BY для новых вставок в таблицы Gold слоя, записывая промежуточные результаты агрегации в целевые таблицы с использованием движка AggregatingMergeTree. Перенос вычислений с этапа выполнения запроса на этап вставки значительно снижает задержки запросов. Конечные запросы, в свою очередь, нуждаются только в объединении меньших промежуточных состояний, что делает их высокопроизводительными и подходящими для поддержки пользовательских приложений с богатыми возможностями фильтрации и агрегации.

Наше демонстрационное приложение ClickPy активно использует материализованные представления для предоставления возможностей визуализации и фильтрации данных по набору Python PYPI, содержащему триллион строк. Подробности доступны в репозитории ClickPy на GitHub.

Полная архитектура Medallion с использованием ClickHouse

Объединив все описанные выше этапы, мы получаем полную архитектуру Medallion, реализованную с помощью ClickHouse:

Эта архитектура Medallion, реализованная на основе ClickHouse, предлагает структурированный подход к управлению конвейерами данных через каскадные преобразования. Благодаря поддержке более чем 70 форматов файлов, сырые данные могут быть непосредственно загружены в Bronze слой с использованием функций s3Queue или ClickPipe (в ClickHouse Cloud), после чего они инкрементально очищаются и обогащаются в Silver слое, а затем подготавливаются в Gold слое для оптимального использования в приложениях и аналитике. Используя таблицы MergeTree ClickHouse, материализованные представления (инкрементальные/обновляемые) и поддержку различных форматов файлов, эта архитектура позволяет организовать процесс загрузки, преобразования и доставки данных без необходимости использования сторонних инструментов.

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

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

Таблицы Gold слоя по своей природе представляют одни и те же данные в разных формах, каждая из которых оптимизирована для потребляющего её приложения. Это приводит к необходимости дублирования данных. Однако связанные с этим затраты на репликацию можно снизить, используя объектное хранилище для таблиц MergeTree с разделением хранения и вычислений.

Кроме того, архитектура требует управления несколькими уровнями, что добавляет сложности в конвейеры данных. Это требует мониторинга, который можно осуществить с помощью системных таблиц ClickHouse, предоставляющих видимость состояния материализованных представлений и процессов миграции данных. Также инструменты, такие как Grafana, могут уведомлять о проблемах, таких как сбои представлений или несоответствия данных, благодаря источнику данных ClickHouse.

Наиболее сложной для устранения является присущая данной архитектуре задержка в доступности данных из-за необходимости последовательного перемещения данных через каждый слой. В результате эту архитектуру сложнее оптимизировать для использования в реальном времени, где критична оперативная доступность данных.

Заключительные мысли и вывод

Архитектура Medallion с использованием ClickHouse демонстрирует мощный, автономный подход к управлению рабочими процессами данных, обеспечивая загрузку, преобразование и потребление данных. Используя встроенные возможности ClickHouse, организации могут строить эффективные, масштабируемые конвейеры, которые предоставляют чистые и оптимизированные наборы данных для аналитики и приложений.

Отличительной особенностью реализации на основе ClickHouse является её автономный подход. Весь процесс — от загрузки данных до их преобразования и потребления — происходит нативно в ClickHouse без необходимости использования сторонних инструментов.

В нашем следующем блоге мы покажем шаги для практического развертывания архитектуры Medallion для данных Bluesky, размещённых на sql.clickhouse.com, где вы сможете исследовать и запрашивать каждый уровень архитектуры напрямую.

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x