раздел 26
Data Engineering
Профессия дата-инженера с нуля: ETL и ELT, хранилища и форматы, моделирование, ночные пайплайны в Airflow, витрины и тесты данных в dbt, потоки событий в Kafka. Дальше аналитика на больших данных: колоночные базы (ClickHouse), DWH (Snowflake, BigQuery), lakehouse (Iceberg, Delta), форматы (Parquet, ORC), потоковая обработка (Flink, Spark Streaming).
Не получилось изменить список. Попробуй ещё раз.
Без входа у каждого урока видно начало. Войди, чтобы читать целиком, отмечать пройденное и решать задачи. войти
«Data Engineering» покупается один раз и остаётся навсегда: 500 ₽. Оплата пока не подключена, доступ открывается промокодом. ввести промокод
Уроки раздела
- Кто такой data engineer и зачем он нужен
- ETL против ELT
- Источники и приёмники данных
- Batch против streaming
- Data lake, warehouse и lakehouse
- Форматы данных: CSV, JSON, Parquet
- Схема звезды: факты и измерения
- Партиционирование таблиц
- Нормализация против денормализации
- Что такое оркестрация и Airflow
- DAG, задачи и операторы
- Первый DAG: расписание и параметры
- Зависимости задач: оператор сдвига
- Backfill: перезаливка истории
- Идемпотентность и повторные запуски
- Качество данных и валидация
- ETL-пайплайн: CSV в базу данных
- Инкрементальная загрузка
- Мониторинг и обзор инструментов
- Батч против стрима: два взгляда на данные
- Проблема M×N: ад точечных интеграций
- Реальное время: где задержка решает
- Где Kafka в карте инструментов данных
- Kafka как распределённый лог событий
- Event streaming и event-driven архитектура
- Топик, партиция, оффсет, брокер, кластер
- Первый кластер: запуск и первые команды CLI
- Лог как абстракция: почему append-only так силён
- Партиции и параллелизм: как Kafka масштабируется
- Ключ партиционирования и порядок внутри партиции
- Продюсеры: отправка, ключи, батчинг
- Подтверждения (acks) и идемпотентный продюсер
- Консьюмеры и группы: параллельное чтение
- Оффсеты и семантики доставки
- Репликация и ISR: как не терять данные
- Хранение и retention: Kafka помнит долго
- Лог-компакция: последнее значение по ключу
- Гарантии доставки и exactly-once на практике
- Сериализация и Schema Registry
- Kafka Connect: интеграция без кода
- Kafka Streams: обработка потоков
- ksqlDB: SQL над потоками
- Event sourcing, CQRS и лог как источник истины
- Kafka в микросервисах: асинхронная развязка
- Альтернативы: RabbitMQ, Pulsar, Redpanda
- KRaft и почему Kafka быстрая
- Мониторинг и эксплуатация: лаг консьюмера
- Типичные ошибки и антипаттерны
- Реальный пример: поток заказов в аналитику
- Зачем нужен Spark: когда данные перестают влезать
- Архитектура Spark: driver, executors и кластер
- SparkSession и экосистема Spark
- RDD: неизменяемость, lineage и отказоустойчивость
- Трансформации и действия: ленивость как основа Spark
- Shuffle, узкие и широкие зависимости, кэширование
- DataFrame против RDD: Catalyst и Tungsten
- Создание DataFrame, схемы и базовые операции
- Функции, типы, null и чтение/запись Parquet
- Spark SQL, группировки и оконные функции
- JOIN в Spark: broadcast против sort-merge
- UDF и pandas UDF: почему обычные UDF медленные
- Партиционирование: сколько партиций, repartition и coalesce
- Shuffle и перекос данных: диагностика и приёмы
- План выполнения, Catalyst/Tungsten и типичные ошибки
- Structured Streaming: бесконечная таблица и watermarks
- MLlib, развёртывание и конфигурация
- Spark в дата-пайплайне: облако, форматы и что дальше
- Аналитическая инженерия: новая роль в данных
- Проблема, которую решает dbt
- ELT против ETL: почему трансформации в хранилище
- dbt Core против dbt Cloud и установка
- profiles.yml: подключение к хранилищу
- Первая модель: model = SELECT
- ref() и автоматический граф моделей
- source(): объявляем сырые таблицы
- Материализации: view, table и ephemeral
- Инкрементальные модели: только новые данные
- Слои модели: staging, intermediate и marts
- Jinja: шаблонизатор поверх SQL
- Макросы и пакет dbt_utils
- Встроенные тесты: unique, not_null и другие
- Свои тесты: singular, generic и unit
- Документация и dbt docs
- Seeds: статичные данные из CSV
- Snapshots: история изменений (SCD type 2)
- dbt_project.yml: конфигурация и теги
- Запуск и выбор: run, test, build и селекторы
- Окружения dev и prod и dbt в Airflow
- CI/CD для dbt: slim CI и проверки в пулл-реквесте
- Хранилища, адаптеры, хуки и операции
- Лучшие практики и реальный пример витрин
- Колоночные базы и ClickHouse: почему агрегаты летают
- Distributed ClickHouse: репликация, шардирование, план запроса
- Cloud DWH: Snowflake, BigQuery, Redshift
- Lakehouse: Iceberg, Delta, Hudi
- Колоночные форматы: Parquet, ORC, Arrow
- Streaming foundations: Kafka и log-based архитектура
- Stream processing: Flink, Spark Streaming, ksqlDB
- Моделирование данных: star schema, SCD, антипаттерны
Понятия курса
Понятия разобраны внутри уроков. Нажми на понятие, чтобы открыть урок, где оно объясняется.
Профессия дата-инженера
- Источники и приёмники данныхОткуда берутся данные (рабочие базы, API, файлы партнёров, события приложений) и куда их кладут: хранилище, озеро, витрины, другие сервисы.урок 3 · Источники и приёмники данныхопираются: урок 4
- Кто такой data engineerДата-инженер строит дороги, по которым данные едут из рабочих баз и сервисов в хранилище и дальше на дашборды и в модели. Чем он отличается от аналитика и бэкендера.урок 1 · Кто такой data engineer и зачем он нуженопираются: урок 2
- ETL против ELTГде чистить данные: по дороге, до загрузки в хранилище, или уже внутри него, SQL-запросами. Почему с дешёвыми облачными хранилищами победил ELT.урок 2 · ETL против ELTопираются: урок 3, урок 68
Хранение данных и форматы
- Форматы данных: CSV, JSON, ParquetСтрочные форматы удобно читать человеку и писать по строке, колоночный Parquet жмётся и читается выборочно. Что выбрать для выгрузки, обмена и хранилища.урок 6 · Форматы данных: CSV, JSON, Parquetопираются: урок 7, урок 58
- Batch против streamingНочная пачка или поток событий: как выбрать по допустимой задержке, цене и сложности. Большинство задач аналитики спокойно живут в батче.урок 4 · Batch против streamingопираются: урок 5, урок 20, урок 50
- Data lake, warehouse и lakehouseХранилище держит чистые таблицы для SQL, озеро хранит всё сырым в файлах, lakehouse добавляет к файлам таблицы с транзакциями.урок 5 · Data lake, warehouse и lakehouseопираются: урок 6
Основы моделирования данных
- Нормализация против денормализацииРабочая база хранит каждый факт один раз, витрина ради скорости чтения повторяет данные. Где какая форма уместна.урок 9 · Нормализация против денормализацииопираются: урок 10
- Партиционирование таблицБольшая таблица делится на части по дате или ключу, и запрос за один день читает одну часть. Партиции же упрощают перезаливку дня.урок 8 · Партиционирование таблицопираются: урок 9, урок 62
- Схема звезды: факты и измеренияТаблица фактов с событиями и числами в центре, вокруг неё измерения: кто, где, когда. Почему аналитикам так проще писать запросы.урок 7 · Схема звезды: факты и измеренияопираются: урок 8
Airflow: основы оркестрации
- Оркестрация и AirflowКогда задач несколько и они зависят друг от друга, cron уже не справляется: нужен оркестратор, который знает порядок, повторяет упавшее и показывает историю.урок 10 · Что такое оркестрация и Airflowопираются: урок 11
- Первый DAG: расписание и параметрыschedule, start_date, catchup и retries. Как планировщик Airflow 3 решает, какие запуски создать, и что такое logical_date.урок 12 · Первый DAG: расписание и параметрыопираются: урок 13, урок 67
- DAG, задачи и операторыDAG описывает пайплайн как граф задач без циклов. Задачи создаются операторами или декоратором @task и передают друг другу результаты через XCom.урок 11 · DAG, задачи и операторыопираются: урок 12
Airflow: зависимости, backfill и идемпотентность
- Зависимости задач: оператор сдвига>> и chain задают порядок, списки дают веер и сборку, trigger_rule решает, что делать задаче, если предок упал.урок 13 · Зависимости задач: оператор сдвигаопираются: урок 14
- Идемпотентность и повторные запускиЗадача, запущенная дважды за один день, должна дать тот же результат, а не дубли. Перезапись партиции и upsert вместо слепого INSERT.урок 15 · Идемпотентность и повторные запускиопираются: урок 16
- Backfill: перезаливка историиairflow backfill create прогоняет DAG за прошлые даты. Зачем нужен интервал данных и почему по умолчанию в Airflow 3 он нулевой.урок 14 · Backfill: перезаливка историиопираются: урок 15
Airflow на практике
- Инкрементальная загрузкаГрузить только новое за интервал запуска, а не всю таблицу с начала времён. Водяной знак и интервал данных.урок 18 · Инкрементальная загрузкаопираются: урок 19
- Качество данных и валидацияПроверки после загрузки: строки на месте, ключи уникальны, суммы сходятся. Упавшая проверка останавливает пайплайн раньше, чем Отто увидит кривой дашборд.урок 16 · Качество данных и валидацияопираются: урок 17
- Мониторинг и обзор инструментовРетраи, колбэки на падение, сетка запусков в интерфейсе. Чем Dagster, Prefect и обычный cron отличаются от Airflow и когда их выбирают.урок 19 · Мониторинг и обзор инструментов
- ETL-пайплайн: CSV в базу данныхВесь путь ночной выгрузки «Гонца»: прочитать CSV, почистить, загрузить в хранилище, проверить. Каждый шаг отдельной задачей.урок 17 · ETL-пайплайн: CSV в базу данныхопираются: урок 18
Kafka: зачем потоковая обработка
- Батч против стримаДва взгляда на одни и те же данные: пачкой раз в час или событием сразу, когда оно случилось.урок 20 · Батч против стрима: два взгляда на данныеопираются: урок 21, урок 65
- Где Kafka в карте инструментов данныхОчередь, лог событий, база, хранилище: что из этого Kafka, а что нет, и с чем её путают.урок 23 · Где Kafka в карте инструментов данныхопираются: урок 24
- Проблема M×N: ад точечных интеграцийКаждый сервис шлёт данные каждому потребителю напрямую, и связей становится M×N. Общий лог событий сводит их к M+N.урок 21 · Проблема M×N: ад точечных интеграцийопираются: урок 22
- Реальное время: где задержка решаетГде секунда задержки стоит денег (антифрод, статус заказа, курьер на карте), а где хватает отчёта за вчера.урок 22 · Реальное время: где задержка решаетопираются: урок 23
Kafka: что это такое
- Первый кластер и команды CLIKafka на одном узле в Docker без ZooKeeper, первые топики, запись и чтение из консоли.урок 27 · Первый кластер: запуск и первые команды CLIопираются: урок 28
- Топик, партиция, оффсет, брокер, кластерПять слов, на которых стоит вся Kafka: где лежат записи, как они пронумерованы и кто их хранит.урок 26 · Топик, партиция, оффсет, брокер, кластеропираются: урок 27
- Event streaming и event-driven архитектураСобытие «заказ создан» против команды «создай заказ»; сервисы реагируют на события, а не вызывают друг друга.урок 25 · Event streaming и event-driven архитектураопираются: урок 26
- Kafka как распределённый лог событийЖурнал, в который только дописывают: каждый читатель идёт по нему в своём темпе, и запись не исчезает после чтения.урок 24 · Kafka как распределённый лог событийопираются: урок 25
Kafka: лог, партиции и параллелизм
- Ключ партиционирования и порядокЗаписи с одним ключом попадают в одну партицию и читаются по порядку; порядок есть только внутри партиции.урок 30 · Ключ партиционирования и порядок внутри партицииопираются: урок 31
- Лог как абстракцияПочему журнал, в который только дописывают, так силён: порядок, повтор с любого места, несколько читателей.урок 28 · Лог как абстракция: почему append-only так силёнопираются: урок 29
- Партиции и параллелизмТопик режется на партиции, и их число задаёт, сколько консьюмеров группы читают одновременно.урок 29 · Партиции и параллелизм: как Kafka масштабируетсяопираются: урок 30
Kafka: продюсеры, консьюмеры и группы
- Консьюмеры и группыГруппа делит партиции топика между участниками; уход или падение участника запускает ребаланс.урок 33 · Консьюмеры и группы: параллельное чтениеопираются: урок 34
- Оффсеты и семантики доставкиЗакоммиченный оффсет это закладка группы. Когда коммитить, решает, будет ли доставка at-most-once или at-least-once.урок 34 · Оффсеты и семантики доставкиопираются: урок 35
- Подтверждения и идемпотентный продюсерacks 0, 1 и all: сколько реплик должно получить запись до ответа; как идемпотентность убирает дубли при повторе.урок 32 · Подтверждения (acks) и идемпотентный продюсеропираются: урок 33
- Продюсеры: отправка, ключи, батчингКак продюсер выбирает партицию, копит записи в батч и зачем ему linger.ms и batch.size.урок 31 · Продюсеры: отправка, ключи, батчингопираются: урок 32
Kafka: надёжность, хранение и гарантии
- Гарантии доставки и exactly-onceТранзакции, read_committed и коммит оффсетов внутри транзакции: что значит «ровно один раз» и где эта гарантия кончается.урок 38 · Гарантии доставки и exactly-once на практикеопираются: урок 39
- Лог-компакцияТопик хранит последнее значение каждого ключа, tombstone удаляет ключ: так живёт текущее состояние заказов.урок 37 · Лог-компакция: последнее значение по ключуопираются: урок 38
- Репликация и ISRЛидер и фолловеры партиции, список синхронных реплик и min.insync.replicas: как не потерять запись, когда брокер упал.урок 35 · Репликация и ISR: как не терять данныеопираются: урок 36
- Хранение и retentionKafka удаляет старые данные целыми сегментами по времени или размеру; активный сегмент живёт, пока в него пишут.урок 36 · Хранение и retention: Kafka помнит долгоопираются: урок 37
Kafka: экосистема
- Сериализация и Schema RegistryБайты в топике и схема рядом: Avro и Protobuf, совместимость backward, forward и full.урок 39 · Сериализация и Schema Registryопираются: урок 40
- Kafka ConnectИсточники и приёмники без своего кода: коннектор переносит данные из базы в топик и из топика в хранилище.урок 40 · Kafka Connect: интеграция без кодаопираются: урок 41
- Kafka StreamsОбработка потока внутри приложения: фильтр, агрегат, окно по времени.урок 41 · Kafka Streams: обработка потоковопираются: урок 42
- ksqlDB: SQL над потокамиПотоки и таблицы в SQL-синтаксисе: те же окна и агрегаты, что в Kafka Streams, без кода на Java.урок 42 · ksqlDB: SQL над потокамиопираются: урок 43
Kafka: паттерны и альтернативы
- Альтернативы: RabbitMQ, Pulsar, RedpandaЧем очередь сообщений отличается от лога и когда выбирать не Kafka.урок 45 · Альтернативы: RabbitMQ, Pulsar, Redpandaопираются: урок 46
- Event sourcing и CQRSЛог как источник истины: состояние заказа собирается из его событий, а чтение отделено от записи.урок 43 · Event sourcing, CQRS и лог как источник истиныопираются: урок 44
- Kafka в микросервисахАсинхронная развязка сервисов и outbox: как не потерять событие, когда запись в базу прошла.урок 44 · Kafka в микросервисах: асинхронная развязкаопираются: урок 45
Kafka: под капотом и эксплуатация
- Мониторинг: лаг консьюмераЛаг группы как главная метрика: откуда он берётся и что делать, когда он растёт.урок 47 · Мониторинг и эксплуатация: лаг консьюмераопираются: урок 48
- Поток заказов в аналитикуВесь путь «Гонца»: продюсер заказов, топики, консьюмер и витрина, из которой Отто строит отчёт по опозданиям.урок 49 · Реальный пример: поток заказов в аналитику
- Типичные ошибки и антипаттерныСлучайные ключи, коммит до обработки, тысячи партиций, медленный обработчик и ребалансы по кругу.урок 48 · Типичные ошибки и антипаттерныопираются: урок 49
- KRaft и почему Kafka быстраяКонтроллер без ZooKeeper, последовательная запись, page cache и zero-copy.урок 46 · KRaft и почему Kafka быстраяопираются: урок 47
Spark: большие данные и архитектура
- Зачем нужен SparkКогда данные перестают помещаться на одну машину и в одну базу: распределённая обработка, что Spark делает лучше скрипта на pandas и почему он сменил MapReduce.урок 50 · Зачем нужен Spark: когда данные перестают влезатьопираются: урок 51
- Driver, executors и кластерДрайвер строит план и раздаёт задачи, исполнители считают партиции на своих ядрах. Задание, стадия, задача и как их видно в Spark UI.урок 51 · Архитектура Spark: driver, executors и кластеропираются: урок 52
- SparkSession и экосистема SparkЕдиная точка входа в Spark 4: настройки сессии, чтение данных, Spark SQL, Structured Streaming и MLlib на одном движке.урок 52 · SparkSession и экосистема Sparkопираются: урок 53
Spark: RDD и модель вычислений
- Трансформации и действияТрансформации только строят план, действие запускает задание. Почему ленивость позволяет Spark оптимизировать цепочку целиком.урок 54 · Трансформации и действия: ленивость как основа Sparkопираются: урок 55
- RDD и lineageНеизменяемый распределённый набор данных из партиций и родословная преобразований, по которой Spark пересчитывает потерянную партицию.урок 53 · RDD: неизменяемость, lineage и отказоустойчивостьопираются: урок 54
- Shuffle, узкие и широкие зависимости, кэшУзкая зависимость остаётся в своей партиции, широкая требует shuffle и делит задание на стадии. Когда кэшировать промежуточный результат.урок 55 · Shuffle, узкие и широкие зависимости, кэшированиеопираются: урок 56
Spark: DataFrame API
- Создание DataFrame, схемы и базовые операцииЧтение CSV со схемой и с выводом типов, select, filter, withColumn, orderBy. Чем опасен inferSchema на грязных данных.урок 57 · Создание DataFrame, схемы и базовые операцииопираются: урок 58
- Функции, типы, null и ParquetВстроенные функции для строк и дат, when и coalesce, поведение null, запись и чтение Parquet с партициями по папкам.урок 58 · Функции, типы, null и чтение/запись Parquetопираются: урок 59
- DataFrame против RDD: Catalyst и TungstenDataFrame знает схему, поэтому оптимизатор Catalyst переписывает план, а Tungsten хранит строки компактно. Почему DataFrame быстрее RDD на Python.урок 56 · DataFrame против RDD: Catalyst и Tungstenопираются: урок 57
Spark: SQL, агрегации и соединения
- JOIN: broadcast против sort-mergeМаленькую таблицу Spark рассылает каждому исполнителю, две большие перемешивает по ключу и сортирует. Порог autoBroadcastJoinThreshold и подсказка broadcast.урок 60 · JOIN в Spark: broadcast против sort-mergeопираются: урок 61
- Spark SQL, группировки и оконные функцииОдин и тот же запрос на SQL и на DataFrame даёт один план. Группировки, оконные функции row_number, lag и нарастающие итоги.урок 59 · Spark SQL, группировки и оконные функцииопираются: урок 60
- UDF и pandas UDFСвоя функция на Python гоняет каждую строку через отдельный процесс. Когда спасает pandas UDF и почему встроенная функция почти всегда лучше.урок 61 · UDF и pandas UDF: почему обычные UDF медленныеопираются: урок 62
Spark: производительность
- Партиционирование: repartition и coalesceСколько партиций нужно, откуда они берутся при чтении файлов, чем repartition отличается от coalesce и как папки по дням отсекают лишнее чтение.урок 62 · Партиционирование: сколько партиций, repartition и coalesceопираются: урок 63
- План выполнения и типичные ошибкиКак читать explain снизу вверх: скан, фильтры у источника, Exchange, агрегаты. Типичные ошибки: collect на драйвер, лишний shuffle, UDF вместо функции.урок 64 · План выполнения, Catalyst/Tungsten и типичные ошибкиопираются: урок 65
- Shuffle и перекос данныхОдна огромная партиция держит всё задание. Как увидеть перекос в Spark UI и что с ним делать: соль, broadcast, AQE.урок 63 · Shuffle и перекос данных: диагностика и приёмыопираются: урок 64
Spark: стриминг и продакшн
- MLlib, развёртывание и конфигурацияКак задача попадает на кластер: spark-submit, исполнители, ядра и память, главные настройки и коротко про MLlib.урок 66 · MLlib, развёртывание и конфигурацияопираются: урок 67
- Spark в дата-пайплайнеSpark между озером и хранилищем: запуск из Airflow, форматы Delta и Iceberg, облачные сервисы и что учить дальше.урок 67 · Spark в дата-пайплайне: облако, форматы и что дальше
- Structured Streaming и watermarkПоток как бесконечная таблица, микробатчи, окна по времени события и водяной знак, после которого опоздавшие события отбрасываются.урок 65 · Structured Streaming: бесконечная таблица и watermarksопираются: урок 66
dbt: аналитическая инженерия
- Аналитическая инженерияАналитический инженер стоит между дата-инженером и аналитиком: берёт сырые таблицы в хранилище и превращает их в проверенные витрины кодом, как программист.урок 68 · Аналитическая инженерия: новая роль в данныхопираются: урок 69
- Какую проблему решает dbtДесятки SQL-запросов, которые зависят друг от друга, без порядка запуска, тестов и истории правок. dbt делает из них проект: модели, граф, тесты и документацию.урок 69 · Проблема, которую решает dbtопираются: урок 70
- Трансформации внутри хранилищаПочему с ELT преобразования переехали в хранилище: SQL понимают все, вычисления дешёвые, а сырые данные остаются под рукой, чтобы пересчитать всё заново.урок 70 · ELT против ETL: почему трансформации в хранилищеопираются: урок 71
dbt: установка и первая модель
- Первая модельМодель dbt это файл с одним SELECT. dbt сам заворачивает его в create view или create table, а имя таблицы берёт из имени файла.урок 73 · Первая модель: model = SELECTопираются: урок 74
- dbt Core и dbt Clouddbt Core это бесплатная утилита командной строки, dbt Cloud это сервис поверх неё с IDE и расписанием. Установка Core и адаптера для своей базы.урок 71 · dbt Core против dbt Cloud и установкаопираются: урок 72
- profiles.yml и подключениеПрофиль говорит dbt, куда подключаться: хост, база, пользователь и схема для моделей. Таргеты dev и prod в одном профиле, проверка через dbt debug.урок 72 · profiles.yml: подключение к хранилищуопираются: урок 73
dbt: ref, source и граф
- ref() и граф моделейМодели ссылаются друг на друга через ref(), а не по имени таблицы. Из этих ссылок dbt строит граф и сам решает, в каком порядке собирать модели.урок 74 · ref() и автоматический граф моделейопираются: урок 75
- source() и сырые таблицыСырые таблицы объявляют в YAML как источники и берут через source(). Так граф начинается с настоящих данных, а имя схемы живёт в одном месте.урок 75 · source(): объявляем сырые таблицыопираются: урок 76
dbt: материализации
- Инкрементальные моделиИнкрементальная модель на каждом запуске дописывает только новые строки вместо полной пересборки. is_incremental(), unique_key, стратегии и --full-refresh.урок 77 · Инкрементальные модели: только новые данныеопираются: урок 78
- Материализации: view, table, ephemeralМатериализация решает, во что превратится модель в базе: представление, таблицу или кусок запроса внутри соседних моделей. Как выбрать между ними.урок 76 · Материализации: view, table и ephemeralопираются: урок 77
dbt: слои и Jinja
- Макросы и dbt_utilsМакрос это функция на Jinja, которая возвращает кусок SQL. Свои макросы и готовые из пакета dbt_utils, установка пакетов через dbt deps.урок 80 · Макросы и пакет dbt_utilsопираются: урок 81
- Слои staging, intermediate и martsStaging чистит и переименовывает сырые таблицы один к одному, intermediate собирает промежуточные шаги, marts отдают витрины для дашбордов.урок 78 · Слои модели: staging, intermediate и martsопираются: урок 79
- Jinja в моделяхJinja это шаблонизатор поверх SQL: переменные, условия и циклы генерируют повторяющийся SQL. dbt compile показывает, что получилось.урок 79 · Jinja: шаблонизатор поверх SQLопираются: урок 80
dbt: тесты и документация
- Встроенные тестыunique, not_null, accepted_values и relationships описываются в YAML рядом с моделью. Тест это запрос, который ищет плохие строки, и падает, если нашёл.урок 81 · Встроенные тесты: unique, not_null и другиеопираются: урок 82
- ДокументацияОписания моделей и колонок живут в YAML рядом с кодом, длинные тексты в блоках docs. dbt docs generate собирает из них сайт с графом проекта.урок 83 · Документация и dbt docsопираются: урок 84
- Свои тесты и unit-тестыSingular-тест это файл с запросом в tests/, свой generic-тест пишется как макрос, а unit-тест проверяет логику модели на придуманных строках.урок 82 · Свои тесты: singular, generic и unitопираются: урок 83
dbt: сиды и снапшоты
- Seeds: справочники из CSVМаленькие справочники вроде нормативов по зонам лежат в репозитории как CSV, dbt seed загружает их в базу, и на них можно ссылаться через ref().урок 84 · Seeds: статичные данные из CSVопираются: урок 85
- Snapshots и SCD type 2Снапшот запоминает историю изменений строки: старая версия получает дату окончания, новая дописывается. Стратегии timestamp и check.урок 85 · Snapshots: история изменений (SCD type 2)опираются: урок 86
dbt: конфигурация, окружения и CI
- Адаптеры, хуки и операцииdbt работает с Postgres, Snowflake, BigQuery и другими через адаптеры. pre-hook и post-hook, on-run-end и dbt run-operation для служебного SQL.урок 90 · Хранилища, адаптеры, хуки и операцииопираются: урок 91
- Команды и селекторыrun, test, build и селекторы --select: модель с предками и потомками, теги, папки, исключения. Сначала dbt ls, потом запуск.урок 87 · Запуск и выбор: run, test, build и селекторыопираются: урок 88
- Лучшие практики и проект целикомСоглашения об именах и структуре проекта на примере витрины Отто от сырых таблиц до дашборда.урок 91 · Лучшие практики и реальный пример витрин
- Окружения и dbt в AirflowРазработка в своей схеме, прод в общей: таргеты dev и prod. Как DAG «Гонца» запускает dbt build после загрузки сырых данных.урок 88 · Окружения dev и prod и dbt в Airflowопираются: урок 89
- CI для dbtПроверка каждого пулл-реквеста: собрать и протестировать только изменённые модели и их потомков через state:modified+ и сохранённый прод-манифест.урок 89 · CI/CD для dbt: slim CI и проверки в пулл-реквестеопираются: урок 90
- dbt_project.ymlНастройки проекта по папкам: материализации, схемы и теги. Почему кастомная схема получается dbt_dev_marts, а не marts.урок 86 · dbt_project.yml: конфигурация и тегиопираются: урок 87
Колоночные базы и OLAP
- Колоночное хранилище: row vs column, кардинальность, компрессияЧем колоночный layout отличается от строкового и почему агрегаты по миллиарду строк отвечают за секунды. Sparse primary key, кардинальность, кодеки.урок 92 · Колоночные базы и ClickHouse: почему агрегаты летают
- OLAP vs OLTP: где не ClickHouseГраницы применимости. Точечные UPDATE, транзакции, low-latency lookups, граф запросов: всё это не работа OLAP-систем.урок 94 · Cloud DWH: Snowflake, BigQuery, Redshift
- ClickHouse MergeTree: parts, granules, bulk insertsСемейство MergeTree, физическая раскладка данных, гранулы и засечки, batched-вставки от 10 тысяч строк, фоновое слияние парт.урок 92 · Колоночные базы и ClickHouse: почему агрегаты летают
- Materialized views и предагрегатыAggregatingMergeTree, SummingMergeTree, materialized views для предрасчёта агрегатов, TTL для прогревочных таблиц.урок 92 · Колоночные базы и ClickHouse: почему агрегаты летают
Распределённый ClickHouse
- ReplicatedMergeTree и ClickHouse KeeperMulti-master репликация через Raft (Keeper), eventually consistent чтения, настройка кворума на запись.урок 93 · Distributed ClickHouse: репликация, шардирование, план запроса
- Distributed engine, шардирование, JOIN-режимыDistributed-таблица как fan-out по шардам, ключ шардирования, режимы JOIN (GLOBAL, local), boundaries colocated joins.урок 93 · Distributed ClickHouse: репликация, шардирование, план запроса
- EXPLAIN, skipping indexes, projectionsЧтение плана запроса, чем skipping index отличается от primary key, projection как материализованная альтернатива.урок 93 · Distributed ClickHouse: репликация, шардирование, план запроса
DWH (Snowflake, BigQuery, Redshift)
- Архитектура DWH: разделение compute и storageCloud DWH строится на разделении S3-like хранилища и эластичных compute-кластеров. Что это даёт по цене и масштабированию.урок 94 · Cloud DWH: Snowflake, BigQuery, Redshift
- Snowflake против BigQuery: warehouses, slots, биллингSnowflake поднимает T-shirt warehouses (XS, S, M, L), BigQuery платит за просканированные байты. Когда что выгоднее.урок 94 · Cloud DWH: Snowflake, BigQuery, Redshift
- Redshift, Spectrum, federated queriesRedshift как классический MPP, Spectrum как мост к S3-данным, federated queries в Postgres и Aurora.урок 94 · Cloud DWH: Snowflake, BigQuery, Redshift
Lakehouse (Iceberg, Delta, Hudi)
- ACID и time travel в lakehouseКак atomic-commit делается через указатель на manifest, snapshot isolation, time travel, vacuum старых snapshot-ов.урок 95 · Lakehouse: Iceberg, Delta, Hudi
- Iceberg, Delta, Hudi: trade-offsСравнение трёх форматов: что лучше для streaming-upsert, что для batch-аналитики, как с эволюцией схемы.урок 95 · Lakehouse: Iceberg, Delta, Hudi
- Lakehouse: ACID-таблицы поверх object storeИдея lakehouse: ACID-семантика и time travel поверх Parquet в S3. Чем это отличается от классического data lake.урок 95 · Lakehouse: Iceberg, Delta, Hudi
Колоночные форматы (Parquet, ORC, Arrow)
- Parquet и ORC: row groups, encoding, predicate pushdownСтруктура файла Parquet: row groups, column chunks, pages. Кодеки (Snappy, ZSTD), encodings (RLE, dictionary), predicate pushdown через статистики.урок 96 · Колоночные форматы: Parquet, ORC, Arrow
- Apache Arrow: in-memory columnar, zero-copy interchangeArrow это in-memory представление колоночных данных, которое разные системы читают без сериализации. Зачем это для DataFrames и query engines.урок 96 · Колоночные форматы: Parquet, ORC, Arrow
Стриминг (Kafka, Flink, Spark, ksqlDB)
- Kafka как лог: партиции, consumer groups, retentionKafka, distributed append-only log. Партиции дают параллелизм, consumer groups делят нагрузку, retention решает, как долго лежит история.урок 97 · Streaming foundations: Kafka и log-based архитектура
- ksqlDB и SQL поверх KafkaSQL-движок, превращающий Kafka в таблицы и стримы. Когда выгоднее ksqlDB вместо Flink или Spark.урок 98 · Stream processing: Flink, Spark Streaming, ksqlDB
- Flink: event time, watermarks, stateful operatorsЧем event time отличается от processing time, как watermarks справляются с late events, что значит exactly-once в Flink.урок 98 · Stream processing: Flink, Spark Streaming, ksqlDB
- Spark Structured Streaming: micro-batch и continuousStructured Streaming как micro-batch поверх DataFrame API, continuous mode для миллисекундных latencies, watermarks и stateful aggregates.урок 98 · Stream processing: Flink, Spark Streaming, ksqlDB
Моделирование данных
- Антипаттерны моделирования данныхПочему OLAP не любит EAV, что не так с widetable-everything, когда денормализация полезна, что такое late binding.урок 99 · Моделирование данных: star schema, SCD, антипаттерны
- Star schema, snowflake, slowly changing dimensionsКлассическая модель Кимбалла: факты и измерения. SCD type 1 (overwrite), type 2 (history), type 3 (previous value).урок 99 · Моделирование данных: star schema, SCD, антипаттерны