Открыто 10 глав
Первый урок: 09:00. Витрина за вчера пустая, за позавчера удвоена
Интерактивный курс · Data Engineering
Витрина за вчера пустая.
С сегодня загрузка твоя.
Не «введение в дата-инжиниринг», а одна лента, которую ты собираешь сам: источник → сырой слой → staging → DDS → витрина в ClickHouse, под расписанием, с проверками и перезапуском. Настоящие сигнатуры Airflow 3 и Kafka, живой SQL в PostgreSQL и ClickHouse, ноль установки: ни докера, ни облачного аккаунта.
- живые ячейки в PostgreSQL и ClickHouse
- настоящий импорт airflow.sdk
- ноль установки: только вкладка браузера
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Та же дата, запущенная дважды
Предложение
Шесть аварий, которые ты уже видел
Каждой посвящена глава, и каждая воспроизводится живьём: сначала ты ломаешь ленту сам, потом чинишь — и проверка смотрит на поведение склада, а не на текст запроса.
Кому
Курс-дельта, а не курс с нуля
Мы точно знаем, что ты уже умеешь, потому что сами этому научили — рядом лежат курсы SQL, аналитики, производительности и BigQuery. Поэтому здесь не пересказывается ни один их абзац. И поэтому же курс подойдёт не всем.
Подойдёт
- Аналитику или SQL-разработчику, которому отдали ночную загрузку — и теперь он дежурит по ней
- Тому, кто уверенно пишет SELECT с JOIN, GROUP BY и окнами, знает базовый Python, но ни разу не писал DAG
- Тому, кто читает вакансии Data Engineer и видит там Airflow, ClickHouse и Kafka — три из них здесь исполняются, а не пересказываются
- Тому, кто уже прошёл наш курс аналитики: капстоун пересчитывает ту самую когортную витрину, которую ты считал руками в ноутбуке
Не подойдёт
- Новичку без SQL. Здесь нет ни абзаца про SELECT, JOIN, GROUP BY и оконные функции — это соседний курс, и курс DE начинается там, где тот заканчивается
- Тому, кто ищет «профессию с нуля за восемь месяцев». Обещание здесь у́же и честнее: переход аналитик → инженер данных
- Тому, кому нужен Spark, Hadoop или Kubernetes. Их в курсе нет, и это сказано ниже отдельной секцией, а не мелким шрифтом
- Тому, кому нужен диплом и трудоустройство. Курс даёт навык, работающую ленту и сертификат платформы — не гарантию оффера
Три сцены
Что ломается на ленте
Три механизма, вокруг которых собран курс. Ниже — то же самое, но нарисованное: два прогона одной даты, отметка загрузки с опоздавшей правкой и куски ClickHouse, в которых версия не заменяет строку.
Повтор не должен быть виден
Ретрай, backfill и ручной перезапуск — обычная жизнь ленты. Голая вставка удваивает день; перезапись партиции оставляет число прежним. Курс проверяет это снимком склада после двух прогонов.
Забрать только новое — и не потерять
Отметка загрузки — до какого момента данные уже забраны — живёт в таблице, а не в памяти процесса. Строка, отредактированная задним числом, приезжает ПОЗАДИ отметки, и наивный `>` не увидит её никогда.
В 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смена сдана целиком
Маршрут
Четыре участка одной ленты
Программа собрана как сборка, а не как оглавление: приёмный уровень, хранилище, такт и выдача, дежурство. К концу каждого участка лента умеет на один слой больше — и этот слой запускается.
Приёмный уровень
Забрать данные из источника и не потерять их при повторе
Хранилище
Смысл строки, ключи и история версий — и код, который запускают без тебя
Такт и выдача
Расписание, колоночная витрина и перезапуск за девяносто дней
Дежурство
Проверки, поток — и смена, сданная целиком
Программа
10 глав, 58 уроков, 18,2 часа
Первая глава открыта целиком и бесплатно — вместе с первым настоящим DAG, который ты запустишь дважды. Дальше главы выходят волнами, как это было с BigQuery и Performance.
Приёмный уровень
2 главы · 13 уроковЗабрать данные из источника и не потерять их при повторе
Ночная смена: девять утра
Первая смена на приёмном уровне «Хранилища-9»: роль выдаётся инцидентом, а не определением — витрина за вчера пустая, за позавчера удвоена, а в журнале прогонов падение в 03:14 и ретрай в 03:19. К концу главы ты забираешь данные из источника постранично, приводишь их к контракту строки и запускаешь настоящий DAG дважды — чтобы увидеть дубли и починить их.
Приёмка: сырой слой, отметка загрузки, правки задним числом
Участок «источник → raw → stg», который забирает только новое, не теряет поздние правки, не плодит дубли и переживает повторный запуск. Источник отвечает 429 и обрывается на середине страницы — приёмка обязана это пережить. Здесь же второй режим извлечения: поток изменений, потому что удалённую в источнике строку витрина иначе не забудет никогда.
Хранилище
2 главы · 10 уроковСмысл строки, ключи и история версий — и код, который запускают без тебя
Стеллажи: смысл строки, ключи, история версий
Язык, без которого дальше нельзя: что означает одна строка таблицы, суррогатный ключ, историчное измерение, звезда. Две витрины дали разные числа — потому что одна строка в них означает разное; справочник перезаписали — и история продаж поехала. Глава стоит до оркестрации и до ClickHouse намеренно: backfill оперирует моделью, которой у ученика иначе ещё нет.
Код ленты: где живёт трансформация
Превращение скрипта в код, который запускают без тебя: где физически лежит трансформационный SQL, как он переживает объём, где живут секреты и что обязано быть в строке лога. В 02:14 загрузчик съедает память — потому что тянул всё в один DataFrame. Глава стоит после моделирования и перед оркестрацией: на расписание ставят готовый код, а не черновик.
Такт и выдача
3 главы · 19 уроковРасписание, колоночная витрина и перезапуск за девяносто дней
Такт: DAG и время
Готовый код встаёт на расписание. Азы графа глава не повторяет — они уже даны бесплатно в de1l5 — и открывается тем, чего нельзя понять без инцидента: планировщик читает твой файл снова и снова. Логическая дата против «сегодня», catchup на девяносто запусков, ретраи, которые роняют соседей, и DataFrame, уехавший в XCom.
Выдача: витрина в ClickHouse
Другая физика: колоночный движок, где ORDER BY — это порядок хранения, партиция — единица жизненного цикла, а вместо UPDATE живут версии. Ты сам создаёшь миллион строк в ячейке и смотришь, что с ними делает MergeTree. Первый урок главы открыт бесплатно — «другая физика» продаётся только показом.
Перелив и перезапуск
Две половины ленты соединяются, и лента учится переживать прошлое: перелив PostgreSQL → ClickHouse со всеми ловушками типов, деньги во float и час разницы в таймзонах, размер батча и «слишком много кусков», партиция в PostgreSQL, backfill за девяносто дней — и столкновение двух прогонов одной даты.
Дежурство
3 главы · 16 уроковПроверки, поток — и смена, сданная целиком
Контроль: проверка, которая валит ленту
Чек-лист аналитика превращается в код, который стоит до витрины и падает сам. Данные не приехали, а витрина не пустая — потому что показывает вчерашнее; тихий dropna съел выручку. Свежесть, объём и наблюдаемость здесь СЧИТАЮТСЯ запросом к журналу прогонов, а не рассказываются словами.
Поток: Kafka и «дубли или потери»
Нить идемпотентности замыкается на непрерывный вход: ключ и партиция решают порядок, коммит до или после обработки решает, что ты получишь — дубли или потери, третий консьюмер запускает ребаланс. Ровно четыре урока — ровно столько, сколько эмулятор может показать честно.
Смена сдана: капстоун, карта, экзамен
Лента собирается целиком в четыре захода по двадцать две минуты: приёмка, DDS со звездой и SCD2, витрина в ClickHouse, расписание с проверками и backfill. Потом — карта территории: честный перечень того, чего в курсе нет, ПОСЛЕ сдачи, а не перед ней. И экзамен только из того, что проверяет сервер. Последняя запись в журнал дежурства — та, ради которой курс начался: инцидент первой смены больше не может повториться.
Граница
Чего в этом курсе нет
Курс заканчивается уроком-картой ПОСЛЕ капстоуна: границу своего навыка выпускник должен узнать раньше, чем её обнаружит рекрутер. Витрина обязана говорить то же самое — до покупки, а не после.
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 минуты, без дедлайнов