Mistakes Flashcards

(19 cards)

1
Q

Какие границы стоят по умолчанию в оконных функциях?

A

rows between unbounded preceding and current row

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

Архитектура Spark

A
  1. Driver – центральный компонент, который:
    • создаёт DAG из трансформаций;
    • делит DAG на stages и tasks;
    • отправляет задачи на executors и собирает результаты.
  2. Cluster Manager – выделяет ресурсы для executors. Типы: Standalone, YARN, Kubernetes.
  3. Executors – выполняют задачи (tasks), держат данные в памяти, отправляют статус обратно Driver.
  4. DAG, Stage, Task:
    • DAG – граф всех операций;
    • Stage – часть DAG без shuffle;
    • Task – минимальная единица работы на partition.
  5. Shuffle / Storage – перемещение данных между stages, кэширование в памяти.
  6. Spark UI – мониторинг jobs, stages, tasks и ресурсов executors.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Архитектура Airflow

A
  1. Metadata Database
    - Действительно, база данных — это «сердце» Airflow.
    - Хранит: DAG’и и их состояние, логи выполнения задач, глобальные переменные (Variables), подключения (Connections), информацию о каждом запуске задачи (Task Instance), SLA и прочее.
    - Все компоненты ориентируются на эту базу, она синхронизирует состояние системы.
  2. DAG (Directed Acyclic Graph)
    - DAG — это план выполнения, где описаны задачи и их последовательность.
    - Задачи могут быть PythonOperator, BashOperator, SQLOperator и др., для работы с различными системами (базы, файлы, API).
    - Можно задавать условия, callback’и, retries, SLA, что делает DAG гибким и управляемым
  3. Scheduler (Шедулер)
    - Планирует когда и какие задачи запускать.
    - Определяет приоритет задач, порядок их запуска с учётом зависимостей DAG.
    - Создаёт Task Instances и записывает их в Metadata DB.
  4. Executor (Исполнитель)
    - Определяет как задачи выполняются: локально, параллельно или распределённо.
    - Основные типы:
    • SequentialExecutor — последовательное выполнение (для отладки).
    • LocalExecutor — параллельное выполнение на одном сервере.
    • CeleryExecutor — распределённое выполнение через Celery (RabbitMQ/Redis).
    • KubernetesExecutor — каждая задача запускается в отдельном Pod Kubernetes.
  5. Worker (Воркер)
    - Непосредственно выполняет задачу.
    - Работает под контролем Executor, который распределяет ресурсы (CPU, память) и следит за выполнением.
  6. Web UI
    - Позволяет мониторить DAG’и и задачи, смотреть логи, запускать DAG вручную, управлять переменными и соединениями.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Различия Spark Streaming и Structured Streamin

A

1️⃣ Spark Streaming (старый API)

🧱 Основан на идее микробатчей (micro-batches).

  • Поток данных разбивается на небольшие куски (batch),
    например, каждые 1–5 секунд.
  • Каждый кусок обрабатывается как мини-RDD,
    то есть внутри работает та же модель, что и в обычном Spark.

📦 Пример:

> Если ты читаешь поток логов из Kafka,
Spark собирает все сообщения за 2 секунды и обрабатывает их как одну “порцию”.

🧠 Это не настоящая “поточность”,
но выглядит “почти как real-time”,
потому что задержка между пакетами — всего несколько секунд.

⚠️ Недостатки:

  • Старый, громоздкий API (DStream).
  • Неудобно писать сложные пайплайны.
  • Плохо интегрируется с SQL и DataFrames.

2️⃣ Structured Streaming (новый API)

💡 Современный, декларативный, SQL-подобный подход.

Structured Streaming — это надстройка над Spark SQL,
которая делает поток как будто бесконечную таблицу,
в которую постоянно добавляются новые строки.

📘 Принцип:

> “Поток — это просто таблица, которая всё время растёт”.

Ты можешь писать обычные SQL-запросы к этой таблице:

🧠 Spark автоматически:
- принимает новые данные (например, из Kafka),
- применяет SQL / DataFrame трансформации,
- пишет результаты в реальном времени.

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

Размер блока и производительность

A

От размера блока зависят следующие факторы:
1) Больше размер - меньше метаданных - меньше нагрузка на NN - но и меньше параллелизм при слишком большом размере
2) Меньше размер - больше параллелизма - больше нагрузка на NN и больше метаданных нужно хранить

Выбор размера блока зависит от характера данных и объема кластера.
Данные большие - используй большие блоки.
Данные мелкие - используй мелкие.

Также для производительности:
Следи за Rack Awareness (разности datanodes по разным rack(стойкам))
Мониторь систему (hdfs dfsadmin -report)

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

Rack Awareness

A

Это технология, которая позволяет распределять репликации по узлам таким образом, чтобы достичь максимальной производительности и надежности.
Rack - стойка, место, где расположено несколько узлов.

Если репликации 3 Rack Awareness обычно работает следующим образом:
1) Первая реплика на узле клиента
2) Вторая и третья на отдельной стойке

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

NameNode и архитектура для высокой доступности

A

(Мозг системы, который хранит метаданные о хранящихся данных)

Secondary NameNode (SNN) — делает периодические снимки метаданных (checkpoint) для облегчения восстановления.

Высокая доступность NameNode:
1) Active Namenode (главный NameNode, который выполняет все основные манипуляции с метаданными)
2) Standby NameNode (запасной NameNode, он изменяется вместе с Active Namenode и заменяет его в случае сбоя)
3) QJM Quorum Jurnal Manager - система, которая имеет 3 или больше журнала и фиксирует логи при манипуляции с метаданными в NameNode.
Для производительности здесь все работает по кворуму (больше половины журналов подтвердили, значит запись подтверждена, чтоб всех не ждать)
4) Контролирует живучесть NN Zookeeper. Ему отправляются heartbeat-ы и при необходимости он меняет NameNodes.

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

Apache Hive

A

Это надстройка в hadoop, которая позволяет работать с данными в системе при помощи SQL-синтексиса.
Из себя представляет слой на MapReduce, то есть запросы пишем на sql, но под капотом это все преобразуется в MapReduce скрипт, ну или более современные аналоги Tez, Spark.

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

Основные типы данных и операции spark

A

Типы данных:

RDD — низкоуровневый набор распределённых данных;
DataFrame — структурированные данные со схемой (похоже на таблицу SQL);

Типы операций:

Трансформации (Transformations) — создают новый RDD/DataFrame
👉 map(), filter(), flatMap(), groupByKey(), reduceByKey()
Действия (Actions) — возвращают результат
👉 collect(), count(), first(), saveAsTextFile()

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

repartition
coalesce

A

repartition - позволяет увеличить количество партиций spark, перераспределяя данные
coalesce - позволяет уменьшить количество партиций объединяя соседние без распределения

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

Алгоритм записи данных в HDFS

A

1) Клиент или Spark executor обращается к NameNode с запросом на создание файла.
2) NameNode проверяет права доступа, отсутствие файла и, на основе информации от DataNode, выбирает набор DataNode для записи блоков с учётом репликации и rack awareness.
3) NameNode возвращает клиенту pipeline DataNode.
4) Клиент начинает потоковую запись данных напрямую в DataNode’ы по этому pipeline, при этом HDFS client автоматически разбивает поток на блоки.
5) После успешной записи всех реплик NameNode фиксирует метаданные и файл помечается как завершённый.

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

Алгоритм чтения данных из hdfs

A

1) Клиент или Spark executor обращается к NameNode за метаданными файла.
2) NameNode возвращает информацию о блоках файла и DataNode’ах, на которых хранятся реплики.
3) После этого клиент напрямую, потоково читает данные с выбранных DataNode, обычно отдавая предпочтение ближайшим узлам с учётом rack awareness.
4) Если данные читает Spark, то он будет читать данные параллельно

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

Что за широкие и узкие операции в Spark?

A

1) Узкие - это обычные операции, которые выполняются с участием одной партиции. Такие операции быстры и происходят локально. (map(), filter())
2) Широкие - это операции, для которых необходим shuffle, то есть перемещение данных между узлами и использование нескольких партиций. (count(), show(), repartititon())

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

Как снизить shuffle

A

Shuffle можно уменьшить за счёт broadcast join, фильтрации до wide операций, правильного partitioning, bucketing и настройки spark.sql.shuffle.partitions.

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

Форматы и их преимущества для работы с большими данными

A

Parquet — колоночный формат, который отлично подходит для аналитики и хранения больших объёмов данных в data lake. Он эффективно сжимает данные и позволяет быстро читать только нужные колонки, что экономит ресурсы.

ORC (Optimized Row Columnar) — тоже колоночный формат, часто используется в экосистеме Hadoop и Hive. Он особенно хорош для хранения больших таблиц и иногда даёт лучшее сжатие, чем Parquet.

Avro — строчный формат, который хранит схему данных вместе с самими данными. Он удобен для потоковой передачи данных и обмена между системами, например через Kafka.

Feather — лёгкий бинарный формат для быстрой работы с данными в памяти, особенно в Python и R. Подходит для аналитики в локальных или in-memory задачах, но не для распределённых хранилищ больших объёмов.

CSV и JSON — текстовые форматы, универсальные и простые для обмена. Но они медленные для обработки больших объёмов данных и плохо сжимаются, поэтому не подходят для масштабной аналитики.

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

CDC что это и как реализовать?

A

CDC — это механизм репликации изменений данных, который позволяет получать поток insert/update/delete операций из источника данных.

В production чаще всего используется log-based CDC, где система непрерывно читает журнал транзакций базы данных (например, WAL или binlog), начиная с сохранённой позиции. Это обеспечивает низкую латентность, целостность данных и минимальную нагрузку на БД.

Реализация через триггеры возможна, но обычно используется только в legacy-системах из-за высокой нагрузки и сложностей с масштабированием.

17
Q

Различие postgres, mysql, oracle

A

Если проект стартап / средний бизнес: PostgreSQL — лучший выбор (мощный, бесплатный, масштабируемый).

Если простая веб-приложение / минимальные ресурсы: MySQL/MariaDB.

Если крупный банк или критическая OLTP система: Oracle (или PostgreSQL с enterprise настройками, если бюджет ограничен).

18
Q

Когда партицирование оправдано?

A

Партиционируем, если выполняются хотя бы 2 пункта:
- таблица > 5–10 GB
- фильтрация по одному ключу
- регулярное удаление старых данных

19
Q

Когда использовать партицирование по hash?

A

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