From 806417c1bd59ec885c00f676370b29d364dcf677 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sun, 27 Sep 2026 15:36:07 -0400 Subject: [PATCH] =?UTF-8?q?docs(docs):=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B8=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B0=20=D1=80?= =?UTF-8?q?=D0=BE=D0=B0=D0=B4=D0=BC=D0=B0=D0=BF=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: восстановлен доступ к GitHub, изменились учебные стенды и требования к основной программе. - Что: ссылки для менти возвращены на GitHub; ClickHouse, Kafka и курсовая Clickstream включены в основную программу; уточнены подготовка окружения Python, управление памятью, практика Airflow и вход в DEV1. - Что: обновлены описание публикации через Gitea и бэклог; убрана ссылка на неподходящий курс ClickHouse. - Проверка: строгая сборка MkDocs и проверка пробелов прошли; ссылки и задания сверены с учебными репозиториями. --- README.md | 215 +++++++++++++----- dwh-modeling/README.md | 6 +- mkdocs.yml | 12 +- project/PRD.md | 11 +- project/TODO.md | 27 +++ .../2026-08-04-gitea-vps-site-publishing.md | 26 ++- 6 files changed, 213 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index de82a68..98884dc 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Он подойдёт тем, кто хочет: - системно войти в профессию с нуля или близкого к нулю уровня; -- закрыть пробелы в базе (SQL, Git, Python, DWH, Airflow, Greenplum); +- закрыть пробелы в базе (SQL, Git, Python, DWH, Airflow, Greenplum, Kafka, ClickHouse); - подготовиться к собеседованиям и первым рабочим задачам. Роадмап можно проходить самостоятельно или вместе со мной в формате менторства. @@ -13,9 +13,9 @@ ### Оглавление - [Основные знания](#основные-знания) — Linux, Git, SQL, Python, методологии, Docker -- [Практика и инструменты](#практика-и-инструменты) — Airflow, Greenplum, курсовая работа +- [Практика и инструменты](#практика-и-инструменты) - Airflow, Greenplum, Streaming, ClickHouse, две курсовые - [Карьера и менторство](#карьера-и-менторство) — резюме, собеседования, испытательный срок -- [Расширенные навыки](#расширенные-навыки) — Streaming, ClickHouse, Lakehouse, dbt +- [Расширенные навыки](#расширенные-навыки) - Lakehouse, dbt - [Софт скиллы](#софт-скиллы) - [Дополнительные материалы](#дополнительные-материалы) @@ -25,6 +25,11 @@ - выполнять практику и домашки, а не только смотреть материалы; - возвращаться к разделам по мере появления реальных задач. +Основная программа включает две курсовые: сначала хранилище на Greenplum, +затем [Clickstream на ClickHouse](#большая-курсовая-clickstream). +Streaming и ClickHouse входят в обязательную часть подготовки к трудоустройству. +Lakehouse и dbt можно изучать после нее, под задачи и интересующие вакансии. + --- ## Основные знания @@ -85,12 +90,17 @@ SQL и моделирование данных специально идут р #### Повышение знаний SQL +**Перед DEV1: запустите учебную базу.** Для практики рекомендую +[стенд PostgreSQL с базой bookings](https://github.com/dementev-dev/de-roadmap/tree/main/postgres-bookings). +В README стенда описаны запуск в Docker, подключение через `psql` и DBeaver. +Это наше первое знакомство с Docker: пока достаточно научиться запускать +и останавливать стенд, смотреть его статус и подключаться к базе. +Подробный [блок Docker](#docker) будет дальше. + Смотрим курс от Postgres Pro [DEV1](https://postgrespro.ru/education/courses/DEV1) Темы - от "Введение" до "SQL" включительно, "Управление доступом", "Резервное копирование". Для лучшего усваивания материала проделываем все примеры и домашние задания из конспектов лекций. С темой "PL/pgSQL" можно ознакомиться обзорно. -Для развития навыков инженера будет полезно лабораторные работы делать не в виртуальной машине, а в docker контейнере. Предложенный (не обязательный) вариант - в каталоге `postgres-bookings` репозитория. - Для дальнейшего закрепления материала - читаем книгу [PostgreSQL. Основы языка SQL](https://postgrespro.ru/education/books/sqlprimer) - Глава 8 - Индексы + ДЗ @@ -98,7 +108,7 @@ SQL и моделирование данных специально идут р - Глава 10 - Повышение производительности + ДЗ Вопросы оптимизации запросов хорошо описаны в курсе [QPT](https://postgrespro.ru/education/courses/QPT) от Postgres Pro. Полученные навыки применимы для работы в том числе с Greenplum, и частично, другими БД. -На момент написания, видеолекции были доступны только для старой версии Postgres 13, но ее вполне достаточно. +На странице курса выбирайте материалы и видеозаписи для PostgreSQL 16. #### Моделирование данных Понимание того, **как устроены данные и зачем они нужны**, — ключ к качественным ETL-процессам. @@ -120,7 +130,9 @@ SQL и моделирование данных специально идут р - Теория про Slowly Changing Dimensions: [SCD](dwh-modeling/SCD.md) - (Опционально) Ральф Кимбалл — «Инструментарий хранения и анализа данных» (The Data Warehouse Toolkit) - первые 3 главы - Практика по моделированию статусов клиента: [домашка STG → ODS → DDS → DM](dwh-modeling/Homework_Customer_Status_DDS_DM.md) -- Еще про Data Vault: +- Data Vault и Anchor Modeling изучаем обзорно, для знакомства с основными + понятиями. Глубокий разбор и самостоятельное проектирование на этом этапе + не требуются. Материалы для знакомства: - Конспект и примеры из этого репозитория: [DataVault.md](dwh-modeling/DataVault.md) - [DataVault за 10 минут - Youtube](https://www.youtube.com/watch?v=9oQs_wJ045I) - Статья [«Что такое Data Vault: моделирование КХД для архитектора Big Data»](https://bigdataschool.ru/blog/what-is-data-vault/) — обзор, плюсы/минусы, контекст применения. @@ -139,13 +151,36 @@ SQL и моделирование данных специально идут р ### Python -- Если совсем не знакомы с Python, начинаем с курса ["Поколение Python": курс для начинающих – Stepik](https://stepik.org/course/58852/info) +Если совсем не знакомы с Python, начинаем с курса ["Поколение Python": курс для начинающих - Stepik](https://stepik.org/course/58852/info). + +Перед курсом для продвинутых подготовьте рабочую среду. Она пригодится для +экспериментов с кодом и домашних заданий. + +- Виртуальные окружения (venv) изолируют зависимости проекта: + - [Habr: как настроить виртуальное окружение](https://habr.com/ru/articles/889670/) + - [SkillFactory: Виртуальные окружения в Python](https://blog.skillfactory.ru/venv-virtualnoe-okruzhenie-v-python/) + - [Создание venv и установка пакетов: документация Python](https://docs.python.org/3/tutorial/venv.html) +- JupyterLab позволяет выполнять код по ячейкам и сохранять пояснения рядом с результатами: + - [Блог Практикума: что такое Jupyter Notebook](https://practicum.yandex.ru/blog/chto-takoe-jupyter-notebook/) + - [Установка JupyterLab](https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html) + +Создайте venv, установите в него JupyterLab и запустите из этого же окружения. +В новом ноутбуке выполните несколько ячеек, сохраните `.ipynb`, перезапустите +ядро и выполните все ячейки по порядку. В Git сохраняйте ноутбуки и скрипты, +а каталог `.venv/` добавьте в `.gitignore`. + +Теперь продолжаем изучать Python: + - Изучаем глубже и "оттачиваем" live coding: ["Поколение Python": курс для продвинутых – Stepik](https://stepik.org/course/68343/info) - Продолжение "базы", спрашиваемой на собеседованиях, по Python: ["Поколение Python": курс для профессионалов](https://stepik.org/course/82541/promo). Курс очень полезный, но платный. Вместо него можно почитать "продвинутые" темы дальше. - "Продвинутые" темы: - [Полезные функции](https://pyneng.readthedocs.io/ru/latest/book/10_useful_functions/index.html) - [Работа с файлами в формате CSV, JSON, YAML](https://pyneng.readthedocs.io/ru/latest/book/17_serialization/index.html) - [Итераторы, итерируемые объекты и генераторы](https://pyneng.readthedocs.io/ru/latest/book/13_iterator_generator/index.html) + - Управление памятью (документация на английском): + - [Объекты, ссылки и изменяемость](https://docs.python.org/3/reference/datamodel.html#objects-values-and-types) - почему два имени могут указывать на один список и что происходит при его изменении. + - [Как Python управляет памятью](https://docs.python.org/3/faq/design.html#how-does-python-manage-memory) - подсчет ссылок и сборка циклов в CPython; особенности других реализаций Python. + - [Модуль gc](https://docs.python.org/3/library/gc.html) - справочник для экспериментов со сборщиком мусора. Детали поколений и порогов смотрите для своей версии Python. - [Декораторы Python: пошаговое руководство](https://habr.com/ru/companies/otus/articles/727590/) - Работа с датой/временем: [официальная документация по модулю datetime](https://docs.python.org/3/library/datetime.html) - [Сложность алгоритмов. Разбор Big O](https://habr.com/ru/articles/782608/) — короткий материал, чтобы понимать O(n) vs O(n²) на собеседованиях и в коде @@ -154,12 +189,6 @@ SQL и моделирование данных специально идут р - Введение в [ООП](https://metanit.com/python/tutorial/7.1.php) - [Яндекс Учебник: «Объектная модель Python: классы, поля и методы»](https://education.yandex.ru/handbook/python/article/obuektnaya-model-python-klassy-polya-i-metody) - [Real Python: OOP in Python (tutorial)](https://realpython.com/python3-object-oriented-programming/) -- Виртуальные окружения (venv) — изолируют зависимости проекта; настройте перед установкой Jupyter и библиотек - - [Habr: как настроить виртуальное окружение](https://habr.com/ru/articles/889670/) - - [SkillFactory: Виртуальные окружения в Python](https://blog.skillfactory.ru/venv-virtualnoe-okruzhenie-v-python/) -- Jupyter Lab - - [Блог Практикума: «Что такое Jupyter Notebook: как установить и открыть»](https://practicum.yandex.ru/blog/chto-takoe-jupyter-notebook/) - - Готовый Docker-образ Jupyter Lab со Spark: [Jupyter Docker Stacks, pyspark-notebook](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html#jupyter-pyspark-notebook) - Pandas - [GeeksforGeeks: “Why Pandas is Used in Python”](https://www.geeksforgeeks.org/pandas/why-pandas-is-used-in-python/) - [Skillbox: «Для чего нужна библиотека Pandas»](https://skillbox.ru/media/code/rabotaem-s-pandas-osnovnye-ponyatiya-i-realnye-dannye/) @@ -173,10 +202,14 @@ SQL и моделирование данных специально идут р **Когда блок Python считаем пройденным:** +- создаете venv, устанавливаете в него пакеты и запускаете JupyterLab; можете повторить вычисления в ноутбуке после перезапуска ядра; - вы без подсказок пишете небольшие скрипты с циклами, функциями, обработкой ошибок и работой с коллекциями; - умеете читать и модифицировать чужой код, в том числе с использованием pandas и DataFrame; - уверенно проходите простой live-coding по Python для DE: прочитать CSV/JSON, отфильтровать, сгруппировать данные и посчитать агрегаты. -- можете отвечать как на простые вопросы собеседований (циклы, списки, словари), так и продвинутые (итераторы, декораторы, управление памятью, базовые понятия ООП) +- можете отвечать как на простые вопросы собеседований (циклы, списки, словари), так и продвинутые (итераторы, декораторы, базовые понятия ООП); +- на примере со списком объясняете разницу между объектом и ссылкой на него, + почему `del` одного имени не обязательно уничтожает объект и зачем CPython + нужен сборщик циклического мусора. ### Методологии разработки @@ -283,12 +316,21 @@ Apache Airflow — инструмент для оркестрации ETL-про Материалы: -- [Учебник по Airflow](https://git.dementev.space/ddmitry/airflow-manual) +- [Учебник по Airflow](https://github.com/dementev-dev/airflow-manual) +- [Практические задания на стенде](https://github.com/dementev-dev/airflow-manual/blob/main/airflow-docker/educational-tasks.md) + +Задания выполняем параллельно с чтением учебника. Начинаем с простых DAG +и SQL, затем обрабатываем файлы, загружаем CSV в PostgreSQL и добавляем +проверки качества. Дальше расширяем ETL, разбираем ветвление, повторные +попытки и логирование. Здесь Python и SQL впервые работают вместе +в пайплайне, которым управляет Airflow. **Когда блок Airflow считаем пройденным:** - вы можете объяснить, что такое DAG, задачи, операторы и сенсоры, и как между ними задаются зависимости; - на базе учебного стенда подготавливаете, отлаживаете и запускаете свои DAG'и с расписанием и несколькими шагами (например, загрузка данных и последующие трансформации); +- расширяете загрузку CSV в PostgreSQL: меняете генерацию данных, схему таблицы и загрузку новой колонки; +- добавляете свою проверку качества и убеждаетесь, что она обнаруживает подготовленную ошибку в данных; - уверенно смотрите логи, находите место падения и понимаете, как перезапустить задачу. ### Greenplum @@ -313,7 +355,7 @@ Apache Airflow — инструмент для оркестрации ETL-про **Курс Yandex по Greenplum** — основной учебный курс, рекомендуется пройти целиком: - [Бесплатный курс Yandex Cloud по Greenplum](https://yandex.cloud/ru/training/greenplum) -- Практику по курсу удобно делать на стенде [airflow-dwh-gp-lab](https://git.dementev.space/ddmitry/airflow-greenplum) — `make up` поднимает рабочий Greenplum с PXF, не нужен облачный кластер. +- Практику по курсу удобно делать на стенде [airflow-dwh-gp-lab](https://github.com/dementev-dev/airflow-greenplum) — `make up` поднимает рабочий Greenplum с PXF, не нужен облачный кластер. - Стенд покрывает основные темы курса: типы таблиц (heap / appendonly), политики дистрибуции, сжатие, PXF, анализ планов выполнения (`EXPLAIN`). - Единственное ограничение: cloud-специфичные темы (тема 2 курса — развёртывание в Yandex Cloud) на локальном стенде не покрыты. @@ -324,9 +366,10 @@ Apache Airflow — инструмент для оркестрации ETL-про - можете объяснить, в чём практическая разница между MPP-хранилищем и одиночным Postgres на уровне типичных задач DE и собеседований. ### Курсовая работа -Курсовая работа — важный майлстоун роадмапа: ваш первый end-to-end data-проект. После неё у вас есть ключевые технические навыки для старта карьеры в Data Engineering. +Первая курсовая собирает изученное в один проект: загрузку данных из PostgreSQL, +слои хранилища в Greenplum и управление обработкой через Airflow. -Курсовая выполняется на том же стенде [airflow-dwh-gp-lab](https://git.dementev.space/ddmitry/airflow-greenplum), который вы уже использовали для практики по Greenplum. +Курсовая выполняется на том же стенде [airflow-dwh-gp-lab](https://github.com/dementev-dev/airflow-greenplum), который вы уже использовали для практики по Greenplum. **Что внутри:** @@ -342,6 +385,86 @@ Apache Airflow — инструмент для оркестрации ETL-про - автоматическая проверка (валидационный DAG) проходит без ошибок; - вы можете на собеседовании за 5–10 минут рассказать архитектуру проекта, его цели и показать ключевые части кода. +После этой работы переходим к потокам событий и ClickHouse. Они понадобятся +для [большой курсовой Clickstream](#большая-курсовая-clickstream). + +### Streaming (NiFi + Kafka) +В первой курсовой мы загружали данные из базы. Теперь разберем прием потока +событий: как доставить их в хранилище и продолжить чтение после остановки +обработчика. NiFi помогает собрать поток обработки визуально, Kafka хранит +события в распределенном журнале и позволяет потребителям читать их независимо. + +Материалы: + +- [Apache NiFi с нуля за 3 часа (Youtube-плейлист)](https://youtube.com/playlist?list=PL4MpKy3QjNp_rOEEibc4Ro8UK4g8vLX6_&si=W_hidjHmBOZ_aUfS) — первые 4 видео, дальше — по желанию +- [Лучший Гайд по Kafka для Начинающих За 1 Час (Youtube)](https://www.youtube.com/watch?v=hbseyn-CfXY) + +Практика — на стенде [nifi-kafka-postgres-lab](https://github.com/dementev-dev/nifi-kafka-postgres-lab) (Docker Compose с NiFi, Kafka и Postgres): + +- настраиваем в NiFi простой генератор данных и поток в Postgres; +- строим поток NiFi → Kafka → NiFi → Postgres. + +**Перед большой курсовой нужно уметь:** + +- объяснить связь между топиком, партицией, consumer group и offset; +- отправить сообщения в Kafka и прочитать их потребителем; +- показать на учебном потоке, откуда продолжится чтение после перезапуска, + и объяснить, почему при повторной доставке могут появиться дубли. + +В [курсовой Clickstream](#большая-курсовая-clickstream) события и заказы +поступают через Kafka в ClickHouse. Вернемся к этим вопросам, когда будем +разбирать прием данных и их обработку в хранилище. + +### ClickHouse +ClickHouse используем для аналитики по событиям и заказам. Здесь нужно +разобраться, как хранить данные, выбирать ключ сортировки и строить витрины. +Затем применим это в большой курсовой. + +Материалы: + +- Бесплатный курс [ClickHouse от Yandex Cloud](https://yandex.cloud/ru/training/clickhouse) берем за основу. + +Практика: + +Упражнения по самой СУБД можно выполнять локально на +[clickhouse-learning-cluster](https://github.com/dementev-dev/clickhouse-learning-cluster): +четыре узла ClickHouse в Docker Compose, репликация, шардинг и HAProxy. +Задания по облачной инфраструктуре требуют Yandex Cloud и оплаты ресурсов. + +**Когда готовы переходить к курсовой:** + +- создаете таблицы семейства MergeTree и объясняете выбор `ORDER BY` и `PARTITION BY`; +- различаете шардирование и репликацию, понимаете роль таблиц Distributed; +- загружаете данные, пишете аналитические запросы и можете объяснить, + как устройство таблицы влияет на чтение данных. + +### Большая курсовая: Clickstream + +На стенде [clickstream-data-platform](https://github.com/dementev-dev/clickstream-data-platform) +работаем с хранилищем интернет-магазина. Генератор создает события посетителей +и заказы, Kafka доставляет их в ClickHouse. Данные проходят слои STG, ODS, +DDS и DM; Airflow управляет обработкой, Superset показывает отчеты. + +Часть хранилища уже работает. В заданиях вы строите свои витрины, разбираете +готовые загрузки и меняете их, сверяя результат с исходными данными. +Проверки качества и мониторинг нужны здесь для конкретных задач: заметить +потери и дубли, найти причину расхождения, проверить результат своей правки. + +Начните с запуска по README репозитория, затем прочитайте +[путеводитель по стенду](https://github.com/dementev-dev/clickstream-data-platform/blob/main/docs/handbook/README.md) +и переходите к [учебным заданиям](https://github.com/dementev-dev/clickstream-data-platform/blob/main/docs/labs/README.md). +В основной программе семь ступеней: пять витрин DM, свой график в Superset, +самостоятельная нарезка сессий, изменение расчета сессий в конвейере, +проверки и обработка заказов, разбор сырых событий, мониторинг. +Факультативные расследования можно взять после основной программы. + +**Когда большую курсовую считаем пройденной:** + +- выполнены семь ступеней основной программы и проверки из заданий; +- пять учебных витрин проходят `homework_check`, в Superset построен свой график; +- можете проследить путь события от Kafka до отчета, объяснить свои изменения + и показать, как проверяли их корректность. + --- ## Карьера и менторство @@ -394,49 +517,12 @@ Apache Airflow — инструмент для оркестрации ETL-про --- ## Расширенные навыки -Эти темы выходят за рамки базового минимума для старта в Data Engineering, но дают более полное представление об экосистеме. -Их цель — понимать, зачем и когда используется тот или иной инструмент, а не осваивать его на уровне администратора или DevOps-инженера. +После двух курсовых можно расширить стек: попробовать обработку файлов +в Lakehouse и управление SQL-моделями через dbt. Выбирайте тему под задачи, +с которыми хотите работать. [[к оглавлению]](#оглавление) -Мы кратко знакомимся с: - -- **Streaming** (NiFi + Kafka) — инструментами для построения потоковых и интеграционных пайплайнов; -- **ClickHouse** — колоночной СУБД для высоконагруженной аналитики; -- **Lakehouse** (Spark, Iceberg, Trino) — архитектурой, построенной на разделении compute и storage; -- **dbt** — подходом к трансформации данных как кода. - -Практика ограничивается минимальным рабочим примером (запуск в Docker, простой пайплайн или SQL-модель). -Этого достаточно, чтобы уверенно говорить об инструменте на собеседовании и понимать его место в архитектуре — а всё остальное при необходимости осваивается уже на проекте. - -### Streaming (NiFi + Kafka) -NiFi — визуальный конструктор потоков данных, Kafka — распределённая очередь сообщений. Вместе они закрывают типичный сценарий: принять данные, буферизовать, доставить в хранилище. - -Материалы: - -- [Apache NiFi с нуля за 3 часа (Youtube-плейлист)](https://youtube.com/playlist?list=PL4MpKy3QjNp_rOEEibc4Ro8UK4g8vLX6_&si=W_hidjHmBOZ_aUfS) — первые 4 видео, дальше — по желанию -- [Лучший Гайд по Kafka для Начинающих За 1 Час (Youtube)](https://www.youtube.com/watch?v=hbseyn-CfXY) - -Практика — на стенде [nifi-kafka-postgres-lab](https://git.dementev.space/ddmitry/nifi-kafka-postgres-lab) (Docker Compose с NiFi, Kafka и Postgres): - -- настраиваем в NiFi простой генератор данных и поток в Postgres; -- строим поток NiFi → Kafka → NiFi → Postgres. - -Знакомство с Kafka здесь пригодится и дальше: стенд по ClickHouse в следующей секции принимает данные именно через Kafka. - -### ClickHouse -ClickHouse — колоночная СУБД для аналитики на больших объёмах: миллиарды строк, агрегации за секунды. В российских компаниях это фактический стандарт для витрин, отчётности и продуктовой аналитики, поэтому на собеседованиях тема всплывает часто. - -Материалы: - -- Бесплатный курс [ClickHouse от Yandex Cloud](https://yandex.cloud/ru/training/clickhouse) — берём за основу, в нём много упражнений -- Платный курс [ClickHouse для аналитика – Stepik](https://stepik.org/course/100210/promo?search=6551441002) - -Практика: - -- Упражнения курса Яндекса можно выполнять в их облаке (с оплатой за ресурсы) или бесплатно у себя — на учебном кластере [clickhouse-learning-cluster](https://git.dementev.space/ddmitry/clickhouse-learning-cluster): 4 узла ClickHouse в Docker Compose, репликация, шардинг, балансировка через HAProxy. -- Следующий шаг — стенд [clickstream-ch-kafka-superset-demo](https://git.dementev.space/ddmitry/clickstream-ch-kafka-superset-demo), имитирующий полноценное аналитическое хранилище на ClickHouse: Kafka, Airflow, дашборды в Superset, мониторинг (Prometheus/Grafana), слои STG → ODS → DDS → DM. Внутри — собственный продвинутый курс «Кликстрим на ClickHouse» с уроками прямо на стенде. - ### Lakehouse (Spark, Iceberg, Trino) Lakehouse — архитектурный подход, который соединяет гибкость Data Lake с гарантиями классического DWH. @@ -450,7 +536,7 @@ Lakehouse — архитектурный подход, который соеди - Введение в тему: [«Как не утонуть в данных: выбираем между DWH, Data Lake и Lakehouse» (Habr, Arenadata)](https://habr.com/ru/companies/arenadata/articles/885722/) — что такое Lakehouse, чем он отличается от классического DWH и Data Lake и зачем появился - [DataLearn: «Что такое Apache Spark»](https://youtu.be/Tl9YzC-dQLI) — введение в Spark с нуля, ~40 минут -Практика — курс [«Lakehouse без магии»](https://git.dementev.space/ddmitry/mini-lakehouse-lab) на стенде mini-lakehouse-lab (Spark + Iceberg + Trino + MinIO, всё локально в Docker, без облаков и регистраций): +Практика — курс [«Lakehouse без магии»](https://github.com/dementev-dev/mini-lakehouse-lab) на стенде mini-lakehouse-lab (Spark + Iceberg + Trino + MinIO, всё локально в Docker, без облаков и регистраций): - 8 модулей на ~12–15 часов самостоятельной работы; в каждом — объяснение, демонстрация, задание и checkpoint; - пайплайн `raw → bronze → silver` на реальном датасете NYC Taxi; @@ -480,9 +566,12 @@ dbt (data build tool) — инструмент для трансформации **Когда блок расширенных навыков считаем пройденным:** -- вы можете на собеседовании кратко объяснить, когда уместны Streaming (NiFi/Kafka), ClickHouse, Lakehouse-стек и dbt, и чем они дополняют базовый стек (Postgres, Airflow, Greenplum); -- понимаете типичные сценарии: потоковые интеграции и очереди (NiFi + Kafka), аналитические витрины и отчёты на ClickHouse, Lakehouse-архитектура (Spark/Iceberg/Trino), трансформации данных как код (dbt); -- не боитесь увидеть эти инструменты в описании вакансии и можете поддержать содержательный разговор об их месте в архитектуре. +Оценивайте выбранную тему по результату практики: + +- для Lakehouse можете записать таблицу через Spark, прочитать ее через Trino + и объяснить роль Iceberg, каталога и объектного хранилища; +- для dbt можете изменить SQL-модель, выполнить сборку и тесты, + посмотреть зависимости в документации проекта. --- diff --git a/dwh-modeling/README.md b/dwh-modeling/README.md index 6e5f671..bc3fac8 100644 --- a/dwh-modeling/README.md +++ b/dwh-modeling/README.md @@ -540,7 +540,7 @@ flowchart TD ### Готовые SQL-скрипты -Все необходимые скрипты для построения хранилища находятся в папке [`sql/`](https://git.dementev.space/ddmitry/de-roadmap/src/branch/main/dwh-modeling/sql): +Все необходимые скрипты для построения хранилища находятся в папке [`sql/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/sql): - [`01_ddl_stg-dds.sql`](sql/01_ddl_stg-dds.sql) — создание схем и таблиц (STG, ODS, DDS); - [`02_dml_stg-dds.sql`](sql/02_dml_stg-dds.sql) — первичная загрузка данных и демонстрация SCD2 через полный пересчёт (`full backfill`) из STG; @@ -791,7 +791,7 @@ SELECT 'OK' WHERE EXISTS ( ### Мини-датасет (для практики) -Все данные для практики находятся в папке [`data/`](https://git.dementev.space/ddmitry/de-roadmap/src/branch/main/dwh-modeling/data) — тренируйтесь: +Все данные для практики находятся в папке [`data/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/data) — тренируйтесь: [`customers.csv`](data/customers.csv): ```csv @@ -832,7 +832,7 @@ product_id,valid_from,valid_to,price 9002,2023-01-01,,50 ``` -> 📂 Все SQL-скрипты для построения хранилища находятся в папке [`sql/`](https://git.dementev.space/ddmitry/de-roadmap/src/branch/main/dwh-modeling/sql). +> 📂 Все SQL-скрипты для построения хранилища находятся в папке [`sql/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/sql). --- diff --git a/mkdocs.yml b/mkdocs.yml index 28c09dd..de92892 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,10 +1,10 @@ site_name: "DE Roadmap — Data Engineering с нуля до middle" site_url: https://de.dementev.space/ -site_description: "Роадмап по Data Engineering: SQL, Python, Airflow, Greenplum и далее" +site_description: "Роадмап по Data Engineering: SQL, Python, Airflow, Greenplum, Kafka и ClickHouse" site_author: Dmitry Dementev -repo_url: https://git.dementev.space/ddmitry/de-roadmap -repo_name: ddmitry/de-roadmap +repo_url: https://github.com/dementev-dev/de-roadmap +repo_name: dementev-dev/de-roadmap docs_dir: . site_dir: site @@ -76,9 +76,9 @@ markdown_extensions: extra: social: - - icon: simple/gitea - link: https://git.dementev.space/ddmitry/de-roadmap - name: Gitea + - icon: fontawesome/brands/github + link: https://github.com/dementev-dev/de-roadmap + name: GitHub - icon: fontawesome/brands/telegram link: https://t.me/dementev_dev name: Написать в Telegram diff --git a/project/PRD.md b/project/PRD.md index a62935b..4ec76a4 100644 --- a/project/PRD.md +++ b/project/PRD.md @@ -8,10 +8,13 @@ ### Текущее состояние -Роадмап по Data Engineering живёт как Git-репозиторий. Основной origin -размещён в собственной Gitea -([ddmitry/de-roadmap](https://git.dementev.space/ddmitry/de-roadmap)), а -GitHub Pages сохраняется как резерв после восстановления доступа к GitHub: +Роадмап по Data Engineering живет как Git-репозиторий. Основной origin +и работа над материалами остаются в собственной Gitea +([ddmitry/de-roadmap](https://git.dementev.space/ddmitry/de-roadmap)). +После восстановления аккаунта GitHub изменения зеркалируются туда средствами +Gitea. Ссылки для менти ведут на [GitHub](https://github.com/dementev-dev/de-roadmap), +откуда удобно клонировать стенды и делать свои форки. Сайт по-прежнему +публикуется через Gitea Actions на VPS; GitHub Pages сохраняется как резерв. - Основной контент — монолитный `README.md` (~700 строк) с полным учебным планом. - Дополнительные материалы — в подпапках (`dwh-modeling/`, `postgres-bookings/`): теория DWH-моделирования, SCD, Data Vault, домашние задания, скрипты. diff --git a/project/TODO.md b/project/TODO.md index fddbb0a..a55bf7e 100644 --- a/project/TODO.md +++ b/project/TODO.md @@ -2,8 +2,25 @@ Приоритеты: P1 — делаем в первую очередь; P2 — полезно, когда дойдут руки; P3 — идеи под вопросом. +## P1 + +- [ ] **Проверить синхронизацию GitHub-зеркала `airflow-greenplum`.** + Проверка через `git ls-remote` 2026-09-27: GitHub отстает от Gitea + на коммит `4ed7e6f`, меняющий только `docs/agents/triage-labels.md`. + Учебные материалы совпадают. У `airflow-manual`, `mini-lakehouse-lab` + и `de-roadmap` ветки `main` в Gitea и GitHub совпали; прежнее подозрение + об их отставании по ответам API не подтвердилось. + ## P2 +- [ ] **Дополнить практику Kafka перед Clickstream.** + В `nifi-kafka-postgres-lab` добавить опыты на существующем потоке: + остановить потребителя и дочитать накопившиеся сообщения; прочитать + события двумя независимыми consumer groups; повторить чтение и проверить + дубли в PostgreSQL. Для каждого опыта описать исходное состояние, + действия и проверку результата. Идея согласована 2026-09-27; + реализация в репозитории стенда еще не начата. + - [ ] **Перенос учебника Airflow в de-roadmap.** Перенести 9 глав учебника из `airflow-manual` в `airflow/` (de-roadmap). В `airflow-manual` оставить только стенд (`airflow-docker/`). @@ -39,6 +56,16 @@ ## Сделано +- [x] **Актуализация маршрута и учебных ссылок** - 2026-09-27: + ссылки на стенды, SQL и данные, кнопки репозитория на сайте возвращены + на GitHub; рабочий origin и публикация сайта остаются в Gitea. + Streaming и ClickHouse включены в основную программу перед трудоустройством, + `clickstream-data-platform` стал второй, большой курсовой с критериями + прохождения. Ссылка на курс ClickHouse для аналитика удалена. + venv и JupyterLab перенесены перед курсом Python для продвинутых; + в альтернативу курсу для профи добавлены материалы по управлению памятью + и критерий проверки понимания. + - [x] **Публикация сайта перенесена на Gitea Actions и VPS** — 2026-08-05: настроены repository-scoped host runner, строгая сборка MkDocs, атомарные релизы, nginx и TLS для `de.dementev.space`; GitHub Pages сохранён diff --git a/project/specs/2026-08-04-gitea-vps-site-publishing.md b/project/specs/2026-08-04-gitea-vps-site-publishing.md index af9336a..5bbafa6 100644 --- a/project/specs/2026-08-04-gitea-vps-site-publishing.md +++ b/project/specs/2026-08-04-gitea-vps-site-publishing.md @@ -1,7 +1,8 @@ # Публикация сайта через Gitea Actions и VPS -Статус: реализовано 2026-08-05; механизм синхронизации GitHub-резерва требует -отдельного решения после восстановления доступа к GitHub. Инструкции по +Статус: публикация на VPS реализована 2026-08-05. После восстановления +доступа к GitHub выбран встроенный push mirror Gitea для синхронизации +репозиториев; рабочий origin остается в Gitea. Инструкции по восстановлению и эксплуатации находятся в [`project/ops/gitea-vps-site/README.md`](../ops/gitea-vps-site/README.md). @@ -66,7 +67,11 @@ TLS-сертификат для `de.dementev.space` получает и прод ### Резерв на GitHub Pages -После восстановления доступа к GitHub существующий GitHub workflow продолжает собирать сайт из GitHub-репозитория. Чтобы резерв оставался актуальным, изменения из основной Gitea должны автоматически синхронизироваться с GitHub. Предпочтительный кандидат — встроенный Gitea push mirror; окончательный механизм и его права будут согласованы отдельно после восстановления учётной записи. Резерв доступен по стандартному адресу GitHub Pages, но основной домен направлен на VPS. +Изменения из основной Gitea передаются на GitHub встроенным push mirror. +Ссылки для учащихся ведут на GitHub-зеркала, основной домен остается на VPS. +Workflow в `.github/workflows/deploy-site.yml` сохранен для резервной +публикации. Перед использованием резерва нужно проверить настройки Pages +и успешный деплой: наличие зеркала репозитория само по себе этого не подтверждает. GitHub Pages считается тёплым резервом контента и холодным резервом домена. При отказе VPS владелец вручную переключает DNS и при необходимости повторно активирует custom domain в настройках GitHub Pages. Допустимы задержка распространения DNS и ожидание выпуска TLS-сертификата; автоматический failover не требуется. @@ -87,10 +92,10 @@ GitHub Pages считается тёплым резервом контента | Ошибка сборки ломает опубликованный сайт | Сборка в отдельной версии и атомарное переключение только после успеха | | Сторонний action выполняет неожиданный код | Workflow состоит из собственных команд и не использует `uses:` | | Gitea временно недоступна | Уже опубликованный сайт обслуживается независимо от Gitea | -| VPS недоступна или потеряна | Исходники остаются в Gitea; GitHub Pages служит ручным резервом после восстановления GitHub | +| VPS недоступна или потеряна | Исходники остаются в Gitea; GitHub Pages служит ручным резервом после проверки резервной публикации | | После переключения DNS HTTPS ещё не готов | DNS TTL уменьшается заранее; Certbot запускается сразу после подтверждения публичного HTTP; короткий перерыв принят как допустимый | | Сертификат GitHub Pages не готов во время аварии | Допускается задержка; на время восстановления используется стандартный адрес GitHub Pages | -| GitHub-резерв отстаёт от Gitea | После восстановления GitHub настраивается автоматическая синхронизация; до выбора механизма резерв не считается тёплым | +| GitHub-резерв отстает от Gitea | Проверяем результат push mirror, совпадение коммитов и резервную сборку; до успешной проверки резерв не считается готовым | ## Проверка реализации @@ -109,8 +114,13 @@ GitHub Pages считается тёплым резервом контента Эта спецификация заменяет решения о публикации и custom domain из `project/ADR.md`. Решения того документа о MkDocs Material, структуре файлов и dual-compatible links остаются актуальными. -После реализации нужно обновить `AGENTS.md`, `project/PRD.md` и `project/TODO.md`, чтобы они описывали фактический основной контур публикации. Ссылку на исходный репозиторий в `mkdocs.yml` следует направить на Gitea; ссылку на GitHub можно сохранить как дополнительную после восстановления доступа. +Документация проекта описывает Gitea Actions и VPS как основной контур +публикации. Ссылки репозитория в `mkdocs.yml` направлены на GitHub для менти; +рабочий origin остается в Gitea. -## Открытый вопрос +## Синхронизация GitHub -После восстановления GitHub нужно окончательно выбрать способ автоматической синхронизации резервного репозитория. Базовый кандидат — Gitea push mirror с синхронизацией при каждом push; GitHub при этом становится read-only зеркалом, поскольку mirror перезаписывает расходящиеся изменения. +Способ синхронизации выбран: встроенный Gitea push mirror. Рабочие изменения +вносятся в Gitea, GitHub используется как зеркало для чтения и создания +учебных форков. Нужно отдельно проверить работу зеркал всех стендов и +готовность резервной публикации Pages.