Хранилище-9 · приёмный уровень · курс №5 линейки

Открыто 10 глав

Первый урок: 09:00. Витрина за вчера пустая, за позавчера удвоена

0/58
уроков пройдено
0· +10 за урок
Начать бесплатно

Интерактивный курс · Data Engineering

Витрина за вчера пустая.
С сегодня загрузка твоя.

Не «введение в дата-инжиниринг», а одна лента, которую ты собираешь сам: источник → сырой слой → staging → DDS → витрина в ClickHouse, под расписанием, с проверками и перезапуском. Настоящие сигнатуры Airflow 3 и Kafka, живой SQL в PostgreSQL и ClickHouse, ноль установки: ни докера, ни облачного аккаунта.

  • живые ячейки в PostgreSQL и ClickHouse
  • настоящий импорт airflow.sdk
  • ноль установки: только вкладка браузера
python · airflow 3 Run
from airflow.sdk import dag, task

@dag(schedule="0 3 * * *", catchup=True)
def night_shift():
    @task(retries=3)
    def load(logical_date): ...
03:14 load  failed
03:19 load  success · строк ×2
лента и разрывгде встало → dm_daily_revenue
Формат задачипрогон ×2

Та же дата, запущенная дважды

10
глав — участков одной ленты
58/58
уроков уже открыто
18,2
часов чистого времени
6
уроков бесплатно

Предложение

Шесть аварий, которые ты уже видел

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

Ночная загрузка упала и перезапустилась — выручка за день удвоилась
идемпотентная загрузка
Партиция как единица перезаписи и ключ идемпотентности: второй прогон той же даты не меняет ни строки. Проверяется снимком склада после ДВУХ прогонов.
Инкремент по updated_at не увидел правок задним числом
отметка загрузки и правки задним числом
Где живёт отметка, чтобы пережить перезапуск, почему `>` теряет ровно три строки, и как окно перечитывания ловит опоздавших без полной перезаливки.
Строку удалили в источнике — в витрине она живёт третий месяц
поток изменений
Второй режим извлечения: лог изменений в форме события Debezium (before/after/op) и приёмник, который умеет удалять, а не только дописывать.
Две витрины дали разные числа за один и тот же день
что означает одна строка
Выручка по шапке заказа и по позициям не совпадает, потому что одна строка в них означает разное: в одной таблице — заказ, в другой — позиция заказа. Отсюда суррогатный ключ, SCD2 и звезда, в которой размножение невозможно.
Включил DAG — получил девяносто запусков сразу
расписание, catchup и logical_date
Такт планировщика: что считает парс-тайм, почему `datetime.now()` внутри таски — ошибка, и как ретрай не уносит соседей.
Перезалили пачку в ClickHouse — дубли остались навсегда
версии вместо UPDATE
Другая физика: куски вместо строк, ReplacingMergeTree с FINAL и argMax, партиция как ящик, который перезаписывают целиком.

Кому

Курс-дельта, а не курс с нуля

Мы точно знаем, что ты уже умеешь, потому что сами этому научили — рядом лежат курсы SQL, аналитики, производительности и BigQuery. Поэтому здесь не пересказывается ни один их абзац. И поэтому же курс подойдёт не всем.

Подойдёт

  • Аналитику или SQL-разработчику, которому отдали ночную загрузку — и теперь он дежурит по ней
  • Тому, кто уверенно пишет SELECT с JOIN, GROUP BY и окнами, знает базовый Python, но ни разу не писал DAG
  • Тому, кто читает вакансии Data Engineer и видит там Airflow, ClickHouse и Kafka — три из них здесь исполняются, а не пересказываются
  • Тому, кто уже прошёл наш курс аналитики: капстоун пересчитывает ту самую когортную витрину, которую ты считал руками в ноутбуке

Не подойдёт

  • Новичку без SQL. Здесь нет ни абзаца про SELECT, JOIN, GROUP BY и оконные функции — это соседний курс, и курс DE начинается там, где тот заканчивается
  • Тому, кто ищет «профессию с нуля за восемь месяцев». Обещание здесь у́же и честнее: переход аналитик → инженер данных
  • Тому, кому нужен Spark, Hadoop или Kubernetes. Их в курсе нет, и это сказано ниже отдельной секцией, а не мелким шрифтом
  • Тому, кому нужен диплом и трудоустройство. Курс даёт навык, работающую ленту и сертификат платформы — не гарантию оффера

Три сцены

Что ломается на ленте

Три механизма, вокруг которых собран курс. Ниже — то же самое, но нарисованное: два прогона одной даты, отметка загрузки с опоздавшей правкой и куски ClickHouse, в которых версия не заменяет строку.

Главы 1–2

Повтор не должен быть виден

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

Глава 2

Забрать только новое — и не потерять

Отметка загрузки — до какого момента данные уже забраны — живёт в таблице, а не в памяти процесса. Строка, отредактированная задним числом, приезжает ПОЗАДИ отметки, и наивный `>` не увидит её никогда.

Главы 6–7

В ClickHouse другая физика

UPDATE как в постгресе здесь не работает: строки лежат кусками, новая версия ложится рядом со старой. Обычный SELECT покажет обе — схлопывают FINAL и argMax.

Как это устроено

Код, который копируется в прод

Своего учебного DSL здесь нет — он обесценил бы единственное обещание курса. Эмулируется исполнение, а не язык: по виртуальным часам три попытки с retry_delay в пять минут занимают миллисекунды, а backfill за девяносто дат проходит в одной ячейке.

Две настоящие СУБД

PostgreSQL и ClickHouse — живые песочницы платформы, а не картинки. Одна таблица приезжает в двух физиках: в PG обычная, в CH — MergeTree, ReplacingMergeTree или SummingMergeTree.

Настоящие сигнатуры

`from airflow.sdk import dag, task, Asset` и `consumer.poll(timeout_ms=…)` — Airflow 3 и Kafka в том виде, в каком они стоят в вакансиях. Эмулятор строже прода: DataFrame в XCom и `datetime.now()` внутри таски он не прощает.

Проверяется поведение

Не текст запроса и не формат вывода: фактический топологический порядок тасок, число попыток, число партиций после backfill и снимок склада после двух прогонов одной даты.

Капстоун с первого урока

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

Приёмный уровень · Хранилище-9 · 2184

Ты заступаешь на смену в девять утра

Сигналы больше не приходят по одному: приёмник станции тянет снимки архивов пачками каждую ночь, и раскладывает их по хранилищу лента приёмки. До сегодняшнего дня её вёл предшественник — прежний дежурный, оставивший журнал прогонов и недописанные проверки. Витрина за вчера пустая, за позавчера строки удвоены, в журнале падение в 03:14 и ретрай в 03:19. Дальше сюжет не рассыпается на инциденты: каждая глава добавляет к ленте участок, который ЗАПУСКАЕТСЯ, и к концу смены инцидент, с которого всё началось, физически не может повториться — и это записано не в комментарии, а в коде проверки.

Конвейер не сломался. Он сделал ровно то, что ему велели, — дважды. Разницу между «запустилось» и «посчиталось один раз» тебе и предстоит записать в код.
КВЕРИ · ИИ-наставник станции
  • 03:14падение ночной загрузки
  • 03:19ретрай — и день удвоился
  • 09:00смена принята: витрина пуста
  • D+7лента переживает перезапуск
  • D+30смена сдана целиком

Маршрут

Четыре участка одной ленты

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

I

Приёмный уровень

Забрать данные из источника и не потерять их при повторе

II

Хранилище

Смысл строки, ключи и история версий — и код, который запускают без тебя

III

Такт и выдача

Расписание, колоночная витрина и перезапуск за девяносто дней

IV

Дежурство

Проверки, поток — и смена, сданная целиком

Программа

10 глав, 58 уроков, 18,2 часа

Первая глава открыта целиком и бесплатно — вместе с первым настоящим DAG, который ты запустишь дважды. Дальше главы выходят волнами, как это было с BigQuery и Performance.

I

Приёмный уровень

2 главы · 13 уроков

Забрать данные из источника и не потерять их при повторе

Глава 1бесплатнооткрыта

Ночная смена: девять утра

Первая смена на приёмном уровне «Хранилища-9»: роль выдаётся инцидентом, а не определением — витрина за вчера пустая, за позавчера удвоена, а в журнале прогонов падение в 03:14 и ретрай в 03:19. К концу главы ты забираешь данные из источника постранично, приводишь их к контракту строки и запускаешь настоящий DAG дважды — чтобы увидеть дубли и починить их.

пагинация и курсорконтракт строкипервый DAG
6 уроков · 1 ч 42 минартефакт: журнал дежурств
Глава 2 PROоткрыта

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

Участок «источник → raw → stg», который забирает только новое, не теряет поздние правки, не плодит дубли и переживает повторный запуск. Источник отвечает 429 и обрывается на середине страницы — приёмка обязана это пережить. Здесь же второй режим извлечения: поток изменений, потому что удалённую в источнике строку витрина иначе не забудет никогда.

отметка загрузкидедупликацияпоток изменений (CDC)
7 уроков · 2 ч 12 минартефакт: инвариант идемпотентной приёмки
II

Хранилище

2 главы · 10 уроков

Смысл строки, ключи и история версий — и код, который запускают без тебя

Глава 3 PROоткрыта

Стеллажи: смысл строки, ключи, история версий

Язык, без которого дальше нельзя: что означает одна строка таблицы, суррогатный ключ, историчное измерение, звезда. Две витрины дали разные числа — потому что одна строка в них означает разное; справочник перезаписали — и история продаж поехала. Глава стоит до оркестрации и до ClickHouse намеренно: backfill оперирует моделью, которой у ученика иначе ещё нет.

что означает одна строкасуррогатный ключSCD2
6 уроков · 1 ч 50 минартефакт: карточка смысла строки и SCD2
Глава 4 PROоткрыта

Код ленты: где живёт трансформация

Превращение скрипта в код, который запускают без тебя: где физически лежит трансформационный SQL, как он переживает объём, где живут секреты и что обязано быть в строке лога. В 02:14 загрузчик съедает память — потому что тянул всё в один DataFrame. Глава стоит после моделирования и перед оркестрацией: на расписание ставят готовый код, а не черновик.

батчи и памятьсекреты и Connectionsструктурный лог
4 урока · 1 ч 10 мин
III

Такт и выдача

3 главы · 19 уроков

Расписание, колоночная витрина и перезапуск за девяносто дней

Глава 5 PROоткрыта

Такт: DAG и время

Готовый код встаёт на расписание. Азы графа глава не повторяет — они уже даны бесплатно в de1l5 — и открывается тем, чего нельзя понять без инцидента: планировщик читает твой файл снова и снова. Логическая дата против «сегодня», catchup на девяносто запусков, ретраи, которые роняют соседей, и DataFrame, уехавший в XCom.

logical_dateretries и catchupAssets (Airflow 3)
7 уроков · 2 ч 6 минартефакт: шаблон читаемого DAG
Глава 6 PROоткрыта

Выдача: витрина в ClickHouse

Другая физика: колоночный движок, где ORDER BY — это порядок хранения, партиция — единица жизненного цикла, а вместо UPDATE живут версии. Ты сам создаёшь миллион строк в ячейке и смотришь, что с ними делает MergeTree. Первый урок главы открыт бесплатно — «другая физика» продаётся только показом.

MergeTreePARTITION BYReplacingMergeTree
6 уроков · 2 чартефакт: чек-лист выбора движка
Глава 7 PROоткрыта

Перелив и перезапуск

Две половины ленты соединяются, и лента учится переживать прошлое: перелив PostgreSQL → ClickHouse со всеми ловушками типов, деньги во float и час разницы в таймзонах, размер батча и «слишком много кусков», партиция в PostgreSQL, backfill за девяносто дней — и столкновение двух прогонов одной даты.

PG → ClickHousebackfilltoo many parts
6 уроков · 2 ч
IV

Дежурство

3 главы · 16 уроков

Проверки, поток — и смена, сданная целиком

Глава 8 PROоткрыта

Контроль: проверка, которая валит ленту

Чек-лист аналитика превращается в код, который стоит до витрины и падает сам. Данные не приехали, а витрина не пустая — потому что показывает вчерашнее; тихий dropna съел выручку. Свежесть, объём и наблюдаемость здесь СЧИТАЮТСЯ запросом к журналу прогонов, а не рассказываются словами.

свежесть и объёмкарантиндрейф схемы
5 уроков · 1 ч 34 минартефакт: набор проверок качества
Глава 9 PROоткрыта

Поток: Kafka и «дубли или потери»

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

ключ и партицияat-least-onceидемпотентный приёмник
4 урока · 1 ч 16 мин
Глава 10 PROоткрыта

Смена сдана: капстоун, карта, экзамен

Лента собирается целиком в четыре захода по двадцать две минуты: приёмка, DDS со звездой и SCD2, витрина в ClickHouse, расписание с проверками и backfill. Потом — карта территории: честный перечень того, чего в курсе нет, ПОСЛЕ сдачи, а не перед ней. И экзамен только из того, что проверяет сервер. Последняя запись в журнал дежурства — та, ради которой курс начался: инцидент первой смены больше не может повториться.

капстоункарта территорииэкзамен и сертификат
7 уроков · 2 ч 24 минартефакт: лента целиком и сертификат

Граница

Чего в этом курсе нет

Курс заканчивается уроком-картой ПОСЛЕ капстоуна: границу своего навыка выпускник должен узнать раньше, чем её обнаружит рекрутер. Витрина обязана говорить то же самое — до покупки, а не после.

Spark и Hadoop

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

Вместо обещания — урок-мост: перетасовка данных между узлами, рассылка маленькой таблицы на все узлы и партиционирование показаны на том, что здесь действительно исполняется, плюс интервью-карточка «MapReduce против Spark».

Kubernetes, Terraform, администрирование кластеров

Это работа платформенной команды, а не автора ленты. Курс про то, за что дежурит инженер данных ночью.

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

dbt как каркас курса

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

dbt остаётся врезками — служебные колонки снапшота, которые ты увидишь в чужом проекте, — а освободившийся бюджет отдан Airflow, MPP и идемпотентности.

Настоящий кластер и живой WAL

Песочница платформы работает под непривилегированной ролью без репликации — иначе она перестала бы быть песочницей.

Поток изменений приезжает готовым логом в форме события Debezium, а приёмник к нему пишешь ты. Каждый эмулируемый урок несёт плашку «что здесь понарошку» — её наличие проверяется гейтом, а не совестью автора.

Что останется

Не только пройденные главы

Журнал дежурств

Записи, которые ученик ведёт с первого урока: симптом, причина, проверка, которая не даст этому повториться. К концу курса — личный чек-лист дежурного по ленте.

Работающая лента

Капстоун в четыре захода: приёмка, DDS со звездой и SCD2, витрина в ClickHouse и DAG под расписанием, с проверками и backfill. Не учебный пример, а участок, который запускается.

Экзамен конвейера

Финальный набор задач на общем датасете «Ночная смена»: чинишь чужую ленту и достраиваешь свою. Зачёт — именной сертификат платформы.

Вопросы

Что спрашивают до старта

Нет. Airflow, Kafka и источник данных работают эмуляторами прямо во вкладке, PostgreSQL и ClickHouse — настоящие, в песочнице платформы. Ни докера, ни облачного аккаунта, ни кредитной карты. Открыл вкладку — пишешь DAG.

Смена начинается в девять

Первая глава открыта целиком: 6 уроков бесплатно, живой SQL и настоящий DAG прямо в уроке. Ставить не нужно ничего.

Урок — 14–22 минуты, без дедлайнов