Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Medallion-архитектура: bronze, silver, gold

Medallion-архитектура: бронзовый, серебряный и золотой слои

Трёхуровневая обработка данных: назначение уровней, правила преобразования, хранение и случаи, когда разделение на уровни не даёт выигрыша.

Прямой ответ

Медальонная архитектура делит обработку данных на три уровня по степени готовности: сохранение исходных данных, приведение к согласованной форме и подготовка к бизнес-запросам.

Уровень Содержание Допустимые операции
Bronze Данные в исходном виде Добавление служебных полей загрузки
Silver Очищенные и согласованные данные Фильтрация, типизация, объединение ключей
Gold Данные под бизнес-запросы Агрегация, денормализация, соединение таблиц
# Bronze: сохранение без изменения содержания
bronze = spark.read.json(source_path)
bronze.write.mode("append").partitionBy("dt").saveAsTable("bronze.events")

# Silver: типизация и фильтрация
silver = (
    spark.table("bronze.events")
    .withColumn("event_ts", F.to_timestamp("ts"))
    .filter(F.col("user_id").isNotNull())
    .dropDuplicates(["event_id"])
)
silver.write.mode("overwrite").saveAsTable("silver.events")

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

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

Правило преобразования между уровнями и стоимость разделения

Разделение на уровни даёт восстановимость и согласованность, но требует соблюдения правила ответственности.

Один уровень — один вид преобразования. Бронзовый уровень не выполняет бизнес-логику, серебряный не строит агрегаты под конкретный отчёт. Нарушение правила приводит к тому, что правка показателя требует изменения в двух уровнях.

Каждый уровень хранится отдельно. Данные уровней занимают место, поэтому срок хранения определяется потребностью: бронзовый уровень хранится дольше серебряного, поскольку служит для повторной обработки.

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

Практическое следствие: правило ответственности проверяется вопросом, требуется ли при правке показателя изменение в одном уровне. Изменение в двух уровнях указывает на смешение ответственности.

Три признака избыточного разделения.

Один источник и один потребитель. Промежуточные уровни дублируют данные без использования несколькими потребителями.

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

Преобразование тривиально. Приведение типов и фильтрация выполняются в одном запросе, поэтому разделение на уровни не сокращает сложность.

Отдельный аспект — происхождение данных. Разделение на уровни упрощает отслеживание, откуда взялось значение, поскольку каждый уровень ссылается на предыдущий; о происхождении — в статье про lineage.

Реализация преобразований между уровнями часто выполняется декларативно, чтобы зависимости строились автоматически; о подходе — в статье про dbt.

Практика: построение медальонной архитектуры

1. Сохраняйте исходные данные без изменения содержания. Бронзовый уровень позволяет повторить преобразование после исправления ошибки.

2. Выполняйте очистку на серебряном уровне. Приведение типов, фильтрация и устранение различий источников выполняются один раз.

3. Стройте золотой уровень под конкретные запросы. Универсальная таблица не даёт выигрыша в скорости, поскольку не соответствует ни одному запросу.

4. Соблюдайте правило одного вида преобразования на уровень. Правка показателя должна требовать изменения в одном уровне.

5. Различайте сроки хранения уровней. Бронзовый уровень хранится дольше, поскольку служит для повторной обработки.

6. Фиксируйте зависимости между уровнями. Явное описание зависимостей позволяет определить последовательность выполнения и влияние изменения.

7. Проверяйте использование каждого уровня. Уровень, который не читается ни одним потребителем, занимает место без пользы.

Рекомендации:

  1. Различайте уровень и физическое размещение. Уровни могут размещаться в одном хранилище в разных схемах либо в разных системах.
  2. Учитывайте стоимость хранения. Каждый уровень увеличивает объём, поэтому срок хранения определяется потребностью, а не одинаковым значением.
  3. Не создавайте уровни без потребности. Один источник и один потребитель не требуют промежуточных структур.
  4. Документируйте назначение уровня. Правило, какие преобразования допустимы на уровне, фиксируется и проверяется.
  5. Начинайте с минимального числа уровней. Добавление уровня оправдано появлением потребности, а не заранее.

Практический сценарий: правка показателя требовала изменения в двух уровнях

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

  1. Диагностика. Показатель рассчитывался частично на серебряном уровне, частично на золотом. Изменение определения требовало правки преобразования на серебряном уровне и пересчёта золотого за весь период.
  2. Причина. Бизнес-логика расчёта была распределена между уровнями. Серебряный уровень выполнял агрегацию, которая относилась к подготовке данных под отчёт, поэтому изменение затрагивало оба уровня.
  3. Действия. (а) Перенесли расчёт показателя полностью на золотой уровень, оставив на серебряном только приведение к согласованной форме; (б) зафиксировали правило ответственности уровней в документации; (в) добавили проверку зависимостей, чтобы изменение серебряного уровня не требовало пересчёта всех золотых таблиц; (г) выполнили пересчёт золотого уровня за период с исправленным определением; (д) разделили сроки хранения уровней, сократив хранение серебряного.
  4. Результат. Изменение определения показателя выполняется в одном уровне без пересчёта серебряного.

Вывод: распределение бизнес-логики между уровнями делает изменение показателя многошаговым. Соблюдение правила одного вида преобразования на уровень ограничивает правку одним уровнем.

FAQ

Чем медальонная архитектура отличается от классических слоёв хранилища? Названием и акцентом на уровень обработки: бронзовый соответствует сырому слою, серебряный — интегрированному, золотой — витринам. Правила разделения совпадают.

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

Можно ли читать серебряный уровень напрямую? Технически да, но это означает, что преобразование под запрос выполняется в запросе. Золотой уровень строится именно для устранения таких преобразований.

Сколько уровней нужно минимально? Два: сохранение исходных данных и подготовка к запросам. Третий уровень оправдан несколькими потребителями либо требованием к согласованной модели.

Источники: Delta Lake, Spark SQL data sources, dbt — ссылки в шапке.