Вопросы по ETL и Airflow на собеседовании
Пайплайны спрашивают через отказы: что произойдёт, если задача упала на середине и её перезапустили. Ответ показывает, писал ли человек продакшн-загрузки или учебные примеры.
Из чего состоит тема
Так тема разложена в тренажёре: движок ведёт прогресс по каждой подтеме отдельно и возвращает те, где вы ошибаетесь.
- Airflow и DAG'и15
- Надёжность и ретраи15
- IO, БД и сериализация13
- Генераторы и память11
- Идемпотентность и бэкфилы11
- Тесты пайплайнов11
- Качество данных10
- dbt-трансформации9
- Асинхронность и параллелизм8
- Паттерны пайплайнов8
Разборы подтем
Конспект по каждой: что это, как отвечать вслух, на чём валятся, плюс вопросы для самопроверки.
- Airflow и DAG-и15 вопросов
- Качество данных в пайплайне10 вопросов
- dbt: трансформации в хранилище9 вопросов
- Идемпотентность и бэкфилл11 вопросов
- Паттерны пайплайнов данных8 вопросов
- Асинхронность и параллелизм в Python8 вопросов
- Генераторы и память в пайплайнах11 вопросов
- IO, базы и сериализация в Python13 вопросов
- Надёжность пайплайна и ретраи15 вопросов
- Тесты пайплайнов данных11 вопросов
Примеры вопросов с разбором
- Что такое DAG в оркестраторе вроде Airflow?A)Направленный ациклический граф задач с зависимостями между нимиB)Единая большая монолитная SQL-процедура, которую база выполняет целиком за разC)Очередь сообщений между микросервисами без всякого порядкаD)Формат хранения таблиц на диске в колоночном представлении
показать ответ и разбор
+A)Направленный ациклический граф задач с зависимостями между ними// разбор: DAG (directed acyclic graph) описывает задачи и порядок их выполнения через зависимости. Ацикличность обязательна: цикл невозможно упорядочить и спланировать. Оркестратор строит по DAG расписание, следит за статусами и ретраит упавшие задачи — это про координацию шагов, а не про сам код обработки.
- Что такое data quality checks в пайплайне?A)Проверки, замеряющие общую скорость и производительность пайплайнаB)Автоматические юнит-тесты кода трансформаций, но не самих данныхC)Ручной визуальный просмотр аналитиком выгрузки примерно раз в квартал перед сдачей квартального отчёта руководству компанииD)Автопроверки данных: схема, доли пропусков, диапазоны, уникальность ключей
показать ответ и разбор
+D)Автопроверки данных: схема, доли пропусков, диапазоны, уникальность ключей// разбор: DQ-проверки автоматически валидируют сами данные в потоке: соответствие схемы, доля null'ов, диапазоны значений, уникальность ключей, ожидаемый объём. Они отличаются от юнит-тестов кода (те проверяют логику, а не текущие данные) и от ручных просмотров — работают на каждом запуске и останавливают распространение мусора.
- Что такое dbt и в какой парадигме он работает?A)Dbt — это оркестратор пайплайнов, заменяющий Airflow и сам вытягивающий данные из источниковB)Dbt — это движок распределённых вычислений вроде Spark, обрабатывающий данные вне хранилищаC)Dbt — библиотека для обучения ML-моделей на данных, лежащих в аналитическом хранилищеD)SQL-трансформации внутри хранилища; модель = SELECT, это T в ELT
показать ответ и разбор
+D)SQL-трансформации внутри хранилища; модель = SELECT, это T в ELT// разбор: dbt (data build tool) отвечает за трансформацию уже загруженных в хранилище данных — букву T в ELT. Модель dbt — это, по сути, SELECT-запрос в .sql-файле; dbt оборачивает его в CREATE TABLE/VIEW и выполняет прямо в DWH (ClickHouse/Postgres/Snowflake/Greenplum). dbt добавляет вокруг SQL инженерные практики: зависимости через ref(), тесты данных, документацию, версионирование в git, окружения. Он не грузит и не извлекает данные — только трансформирует их силами самого хранилища.
- Что значит, что задача пайплайна идемпотентна?A)Повторный запуск задачи даёт тот же результат без дублей и побочекB)Задача, которая исполняется строго один разC)Задача, которую не получится перезапустить после сбояD)Задача, которая при повторном запуске выполняется заметно быстрее благодаря кэшированию промежуточного результата на диске
показать ответ и разбор
+A)Повторный запуск задачи даёт тот же результат без дублей и побочек// разбор: Идемпотентность = повторное выполнение не меняет итог: перезапуск после сбоя не создаёт дублей и побочных эффектов. Это ключевое свойство надёжного пайплайна, потому что оркестратор штатно ретраит упавшие задачи. Достигается перезаписью партиции целиком или upsert'ом по ключу вместо слепого добавления.
- Какие есть базовые стратегии загрузки таблицы и когда каждую берут?A)Стратегия загрузки одна — full refresh, а append и merge применять не рекомендуетсяB)Merge и append — это полные синонимы, оба просто дописывают новые строки в конец таблицы одинаковоC)Full / append / merge — по размеру и тому, меняются ли строкиD)Full refresh обязателен для больших факт-таблиц, потому что он обеспечивает свежесть данных
показать ответ и разбор
+C)Full / append / merge — по размеру и тому, меняются ли строки// разбор: Три базовые стратегии. Full refresh: перезаписать таблицу целиком — просто и идемпотентно, годится для небольших/справочных данных. Append-only: дописывать только новые строки — для неизменяемых событий/логов (быстро, но не отражает изменения существующих). Merge/upsert: по ключу вставить новые и обновить изменённые (ON CONFLICT/MERGE) — для больших таблиц, где строки и добавляются, и меняются. Выбор диктуют объём (full дорог на больших) и изменяемость (append не годится, если строки правятся). Часто комбинируют с партиционированием (overwrite партиции).
- Что такое GIL (Global Interpreter Lock) в CPython?A)Глобальный лок, позволяющий выполнять байткод Python лишь одному потоку одновременноB)Механизм, который автоматически распараллеливает Python-код по всем ядрам процессора сразуC)Лок уровня отдельного объекта, защищающий конкретную переменную от гонок данныхD)Настройка, отключающая многопоточность в Python на уровне операционной системы
показать ответ и разбор
+A)Глобальный лок, позволяющий выполнять байткод Python лишь одному потоку одновременно// разбор: GIL — мьютекс интерпретатора CPython: в любой момент Python-байткод исполняет только один поток. Поэтому чисто вычислительный (CPU-bound) код не ускоряется несколькими потоками — они не идут параллельно по ядрам. На I/O-bound задачах GIL отпускается во время ожидания (сеть, диск), и потоки полезны. Для параллельного CPU берут процессы (multiprocessing).
- Почему читать большой файл генератором лучше, чем целиком в список?A)Читать весь файл в один список обычно заметно быстрее и надёжнее построчногоB)Генератор и чтение в список расходуют примерно одинаковый объём памятиC)Генератор держит одну строку за раз — файл больше RAM обработаетсяD)Построчное чтение через генератор в Python работает медленнее и не рекомендуется
показать ответ и разбор
+C)Генератор держит одну строку за раз — файл больше RAM обработается// разбор: Чтение всего файла в список (или .read()) держит его целиком в памяти — на файле больше RAM процесс упадёт по памяти. Генератор (например, итерация for line in file) отдаёт по одной строке, и обработка идёт в константной памяти независимо от размера файла. Это база потоковой обработки данных в Python.
- Почему построчный INSERT в цикле медленнее батчевой вставки (executemany)?A)Построчный INSERT быстрее, потому что БД оптимизирует каждую отдельную маленькую вставку эффективнее пакетнойB)Разницы в скорости нет: число round-trip'ов к базе на итог вообще никак не влияетC)Каждый INSERT — отдельный round-trip к БД; батч шлёт много строк за один обмен, амортизируя накладныеD)Батч медленнее, так как БД вынуждена держать всю пачку строк в памяти до фиксации транзакции
показать ответ и разбор
+C)Каждый INSERT — отдельный round-trip к БД; батч шлёт много строк за один обмен, амортизируя накладные// разбор: Вставка по строке платит фиксированные накладные (сетевой round-trip, парсинг запроса, транзакционные издержки) на каждую строку — на миллионах это доминирует над самой записью. executemany/COPY/batch отправляет пачку строк за один обмен, амортизируя накладные и разгружая планировщик. Разница на больших объёмах — порядки. COPY в Postgres ещё быстрее executemany.
- Что такое retry с backoff?A)Повтор упавшего вызова с нарастающей паузой между попыткамиB)Мгновенный повтор запроса без пауз между попытками, пока он не пройдётC)Полный откат всей транзакции базы данных при первой же ошибкеD)Кэширование ответа внешнего сервиса, чтобы не звать его повторно
показать ответ и разбор
+A)Повтор упавшего вызова с нарастающей паузой между попытками// разбор: Внешние сервисы и сеть временно флапают, поэтому упавший вызов повторяют — но с нарастающей паузой (backoff), чтобы дать системе восстановиться и не добить её шквалом. Обычно ограничивают число попыток и общий бюджет времени. Повтор без пауз только усугубляет перегрузку и превращает сбой в лавину.
это 9 из 111
Ещё 102 вопросов по теме — в тренажёре, с движком повторения
Прочитать разбор и ответить самому — разные навыки. В Сеньорчике вопросы идут сессиями, а движок возвращает подтемы, где вы ошибаетесь, пока они не начнут отскакивать. Бесплатно, лимит по энергии.
Частые вопросы
Что такое идемпотентность в пайплайне?
Повторный запуск за тот же период даёт тот же результат без дублей. Достигается перезаписью партиции целиком или ключами дедупликации, а не добавлением строк вслепую.
Что спрашивают про Airflow?
Модель DAG и зависимостей, расписание и дату выполнения, различие между планировщиком и исполнителем, повторные попытки, бэкфилл и как не превратить оркестратор в место обработки данных.