(Ашан) Batch Data Platform для аналитики пользователей Flashcards

(43 cards)

1
Q

Какая была цель проекта?

A

Цель проекта заключалась в создании централизованной batch-платформы для хранения и обработки данных о поведении пользователей, чтобы ускорить аналитику и помочь маркетингу и продукту принимать эффективные решения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Кто были основные пользователи данных?

A

Основными пользователями были аналитики, продуктовые менеджеры и маркетологи. Аналитики использовали данные для построения отчетов и исследований, продукт — для оценки фичей, маркетинг — для анализа кампаний.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие типы данных обрабатывались?

A

Обрабатывались данные о кликах пользователей, заказах, сессиях и профилях пользователей из PostgreSQL, внешних API и S3.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что за внешние API?

A

1) Партнёрские сервисы/поставщики данных: данные о промо-акциях, скидках, товарах.
2) Яндекс.Метрика

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

А какие именно типы данных это были? Json, csv?

A

Из PostgreSQL данные забирались через Spark JDBC (spark.read.jdbc).
Из внешних API данные получали по HTTP в формате JSON, предварительно сохраняли в staging-слой, после чего обрабатывали в Spark.
Из S3 данные читались напрямую с помощью Spark DataFrame API.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Какие объемы данных?

A

В среднем обрабатывалось несколько сотен гигабайт данных в день, общий объём хранилища — несколько терабайт.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

А куда пропападали данные? Если за несколько дней-недель уже получаются терабайты?

A

Сырые данные сохранялись в Data Lake в Parquet.
Для старых данных использовались retention-политики: часть архивировалась, часть удалялась по TTL, чтобы не разрасталось хранилище.
Агрегированные данные сохранялись в ClickHouse.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

А опиши весь пайплайн данных? Как выглядел high-level architecture пайплайна?

A
  • Источники данных: PostgreSQL, внешние API, S3
  • Обработка: Spark-задания для трансформации данных, оркестрированные Apache Airflow
  • Хранилище: Data Lake на HDFS, аналитические таблицы и витрины в ClickHouse
  • Потребление: BI-инструменты и дашборды для отчетности и аналитики
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Почему выбрали batch, а не streaming?

A

Выбрали batch-подход, потому что он упрощал архитектуру, был дешевле в поддержке, а бизнес-требования были ориентированы на ежедневную отчетность, а не на real-time сценарии.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

За какие части пайплайна ты отвечал лично?

A

Я отвечал за разработку и оптимизацию Spark задач на Python, создание и поддержку Data Lake и аналитических таблиц в ClickHouse, а также за построение пайплайнов в Apache Airflow для ежедневных batch-процессов. CI/CD сам не настраивал, но мой код проходил через CI/CD пайплайны.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Как организовывалось CI/CD, кто этим занимался

A

CI/CD я не настраивал с нуля, но мой код проходил через пайплайны, и я понимал, как они работают.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Чем еще занимался второй DE?

A

В принципе тем же, что и я без учета CI/CD

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Сколько человек было в команде?

A

В команде было 3 человека: 2 Data Engineer, 1 аналитик

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Был ли код-ревью? Кто утверждал архитектурные решения?

A

Да, был процесс код-ревью. Архитектурные решения обсуждались командой и утверждались старшим Data Engineer

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Старший DE не считался в команде?

A

Старший Data Engineer не входил в ядро команды разработки, но утверждал архитектурные решения, делал код-ревью и помогал с оптимизацией пайплайнов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Проект строился с нуля?

A

Большая часть платформы строилась с нуля: мы создавали Data Lake на HDFS, писали Spark ETL/ELT задачи и строили Airflow-пайплайны. Частично дорабатывались готовые аналитические таблицы ClickHouse

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Какие решения ты принимал сам, а какие — нет?

A

Я самостоятельно принимал решения по Spark-задачам, оптимизации, структуре Data Lake и логике Airflow-DAG’ов. Архитектурные решения, влияющие на весь пайплайн, обсуждались командой.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Где все это было в gitlab?

A

Весь код хранился в GitLab, там же использовался встроенный CI/CD.

19
Q

Почему ушел с проекта?

A

Основные задачи проекта были выполнены: Data Lake был построен, ETL/ELT пайплайны настроены, аналитические витрины созданы. После этого потребность в дополнительной работе Data Engineer на проекте была минимальна

20
Q

Почему выбрали Spark, а не чистый Python / SQL?

A

Spark уже был стандартом в компании и хорошо подходил под объемы и HDFS.

21
Q

Как выбирал количество партиций?

A
  • Основывался на количестве ядер кластера (обычно 2–4 партиции на ядро)
  • Смотрел на размер данных (не более 128–256 MB на партицию для оптимальной обработки)
  • Использовал repartition или coalesce при необходимости
22
Q

Хорошо, как ты выберешь количество партиций, если данных 100 гб?

A

«Я ориентируюсь на 100–200 МБ данных на одну партицию. Для 100 ГБ данных это примерно 800–1000 партиций. При этом учитываю количество ядер кластера и после записи проверяю размер файлов, чтобы не было слишком маленьких. При необходимости использую repartition() или coalesce() для оптимизации.»

23
Q

Разница между repartition() и `coalesce()

A
  • repartition(n) — всегда делает shuffle, создаёт n равномерно распределённых партиций
  • coalesce(n) — минимизирует shuffle, уменьшает количество партиций, если нужно только сжать данные
24
Q

Какие форматы использовал (Parquet / ORC / CSV)?

A

В Data Lake использовался Parquet.
На этапе ingestion из API данные приходили в JSON.
CSV использовался редко — в основном для небольших внешних выгрузок или тестов.

25
Почему Parquet лучше CSV?
Parquet хранит схему данных. Колоночный формат. Хорошее сжатие. Лучше работает со Spark, большими данными и аналитическими запросами csv - текстовый формат, плохо сжимается, не хранит схему, подходит для небольшого объема данных и тестов
26
Как делал incremental загрузки?
Основная логика была incremental по updated_at. Late-arriving data анализировали и пришли к выводу, что их влияние на бизнес-метрики минимально, поэтому дополнительная переобработка не внедрялась.
27
Сталкивались ли со schema evolution?
Такого не было, т.к. источники был стабильны. Но у нас было решение на этот счет, мы бы читали данные и добавляли бы новую колонку с null значениями, чтобы можно было работать со старыми данными.
28
Какая была структура веток?
У нас использовался стандартный Git Flow: - `main` — стабильный продакшен-код - `develop` — интеграционная ветка - feature-ветки для разработки ETL и DAG - bugfix/hotfix ветки для исправлений Все изменения проходили код-ревью перед мержем."
29
Писалась ли документация?
"Да, я писал техническую документацию по ETL, DAG и аналитическим таблицам. В документации описывались источники, шаги трансформаций, форматы данных и партиции. Это помогало команде и аналитикам быстро понимать пайплайны."
30
А где писалась документация?
"Документация писалась прямо в GitLab рядом с кодом в Markdown, а для схем и общих описаний использовалась Confluence."
31
Как происходило взаимодействие с пользователями данных?
"Основное взаимодействие было с аналитиками. Они формировали требования к данным и метрикам, я реализовывал пайплайны и витрины, после чего мы совместно валидировали результаты. Обратная связь помогала быстро дорабатывать решения."
32
Как происходило взаимодействие, созвоны или специфические инструменты?
"Требования обсуждали на созвонах в Teams, оперативные вопросы решали в чатах, задачи фиксировались в Jira, а документация велась в Confluence и GitLab."
33
Как было организовано удаление данных по TTL?
"TTL был реализован на нескольких уровнях. В **Data Lake на HDFS** использовались retention-политики: Airflow DAG-и периодически запускали Spark-задачи или shell-скрипты, которые удаляли или архивировали партиции старше заданного периода (например, по дате). В **ClickHouse** использовались встроенные TTL-механизмы таблиц MergeTree, которые автоматически удаляли или перемещали данные при мерджах. Таким образом, старые данные не накапливались и хранилище оставалось под контролем."
34
Как часто запускался Dag под удаление?
DAG на удаление старых данных запускался **раз в сутки**, обычно **в ночное время**, когда основная нагрузка на кластер была минимальной.
35
Почему не использовали стриминг сервисы (kafka, rabitmq)?
"Потому что проект был batch-ориентированным: ежедневная аналитика, без real-time требований. Kafka добавила бы сложности без реальной пользы.
36
С какими ошибками и проблемами сталкивался?
Spark job-ы иногда выполнялись слишком долго. Приходилось думать над оптимизацией, бродкастить таблицы, экспериментировать с партицированием, а также настройками оптимизатора. Проблема была с недостопностью некоторых API, приходилось настраивать ретри механизмы.
37
Что получали из API по яндекс.метрик?
Из Яндекс.Метрики мы забирали **агрегированную статистику по пользовательскому поведению** через Reporting API.
38
Расскажи как проходил твой день?
Обычно с утра проверял, как отработали даги за ночь. Если были ошибки, разбирался, читал логи, ну и при необходимости даг перезапускал. Каждый день был дейлик, обсуждали, что сделали, что не сделали, что надо сделать. Ну а в основном занимался по основным задачам, строил пайплайн, разбирался с задачи Spark, ну и писал документацию к сделанному
39
Какие были достижения?
Мои ключевые достижения: построил Data Lake с нуля, разработал и оптимизировал ETL-пайплайны на Spark, подготовил аналитические витрины в ClickHouse для BI, внедрил incremental загрузки и идемпотентность, а также создал документацию и стандарты для команды. Всё это позволило ускорить аналитику и повысить качество данных."
40
Как писались даги?
DAG-и писались локально в Airflow (обычно через Docker Compose), что позволяло тестировать их в UI и проверять зависимости и структуру задач до деплоя в CI/CD.
41
Как тестировались даги?
В CI/CD были реализованы unit-тесты, которые автоматически тестировали даги
42
А что именно тестировалось?
В DAG-ах мы тестировали импорт, структуру графа, зависимости и базовые параметры.
43
Что происходило при обнаружении ошибки в рабочем пайплайне?
При падении прод-пайплайна сначала срабатывал алёрт, затем создавался тикет. Мы читали, разбирались что не так и устраняли причину — будь то код, данные или инфраструктура — деплоили фикс и переобрабатывали данные. После этого усиливали мониторинг и добавляли тесты, чтобы инцидент не повторился.