Какие границы стоят по умолчанию в оконных функциях?
rows between unbounded preceding and current row
Архитектура Spark
Архитектура Airflow
Различия Spark Streaming и Structured Streamin
1️⃣ Spark Streaming (старый API)
🧱 Основан на идее микробатчей (micro-batches).
📦 Пример:
> Если ты читаешь поток логов из Kafka,
Spark собирает все сообщения за 2 секунды и обрабатывает их как одну “порцию”.
🧠 Это не настоящая “поточность”,
но выглядит “почти как real-time”,
потому что задержка между пакетами — всего несколько секунд.
⚠️ Недостатки:
2️⃣ Structured Streaming (новый API) ✅
💡 Современный, декларативный, SQL-подобный подход.
Structured Streaming — это надстройка над Spark SQL,
которая делает поток как будто бесконечную таблицу,
в которую постоянно добавляются новые строки.
📘 Принцип:
> “Поток — это просто таблица, которая всё время растёт”.
Ты можешь писать обычные SQL-запросы к этой таблице:
🧠 Spark автоматически:
- принимает новые данные (например, из Kafka),
- применяет SQL / DataFrame трансформации,
- пишет результаты в реальном времени.
Размер блока и производительность
От размера блока зависят следующие факторы:
1) Больше размер - меньше метаданных - меньше нагрузка на NN - но и меньше параллелизм при слишком большом размере
2) Меньше размер - больше параллелизма - больше нагрузка на NN и больше метаданных нужно хранить
Выбор размера блока зависит от характера данных и объема кластера.
Данные большие - используй большие блоки.
Данные мелкие - используй мелкие.
Также для производительности:
Следи за Rack Awareness (разности datanodes по разным rack(стойкам))
Мониторь систему (hdfs dfsadmin -report)
Rack Awareness
Это технология, которая позволяет распределять репликации по узлам таким образом, чтобы достичь максимальной производительности и надежности.
Rack - стойка, место, где расположено несколько узлов.
Если репликации 3 Rack Awareness обычно работает следующим образом:
1) Первая реплика на узле клиента
2) Вторая и третья на отдельной стойке
NameNode и архитектура для высокой доступности
(Мозг системы, который хранит метаданные о хранящихся данных)
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.
Apache Hive
Это надстройка в hadoop, которая позволяет работать с данными в системе при помощи SQL-синтексиса.
Из себя представляет слой на MapReduce, то есть запросы пишем на sql, но под капотом это все преобразуется в MapReduce скрипт, ну или более современные аналоги Tez, Spark.
Основные типы данных и операции spark
Типы данных:
RDD — низкоуровневый набор распределённых данных;
DataFrame — структурированные данные со схемой (похоже на таблицу SQL);
Типы операций:
Трансформации (Transformations) — создают новый RDD/DataFrame
👉 map(), filter(), flatMap(), groupByKey(), reduceByKey()
Действия (Actions) — возвращают результат
👉 collect(), count(), first(), saveAsTextFile()
repartition
coalesce
repartition - позволяет увеличить количество партиций spark, перераспределяя данные
coalesce - позволяет уменьшить количество партиций объединяя соседние без распределения
Алгоритм записи данных в HDFS
1) Клиент или Spark executor обращается к NameNode с запросом на создание файла.
2) NameNode проверяет права доступа, отсутствие файла и, на основе информации от DataNode, выбирает набор DataNode для записи блоков с учётом репликации и rack awareness.
3) NameNode возвращает клиенту pipeline DataNode.
4) Клиент начинает потоковую запись данных напрямую в DataNode’ы по этому pipeline, при этом HDFS client автоматически разбивает поток на блоки.
5) После успешной записи всех реплик NameNode фиксирует метаданные и файл помечается как завершённый.
Алгоритм чтения данных из hdfs
1) Клиент или Spark executor обращается к NameNode за метаданными файла.
2) NameNode возвращает информацию о блоках файла и DataNode’ах, на которых хранятся реплики.
3) После этого клиент напрямую, потоково читает данные с выбранных DataNode, обычно отдавая предпочтение ближайшим узлам с учётом rack awareness.
4) Если данные читает Spark, то он будет читать данные параллельно
Что за широкие и узкие операции в Spark?
1) Узкие - это обычные операции, которые выполняются с участием одной партиции. Такие операции быстры и происходят локально. (map(), filter())
2) Широкие - это операции, для которых необходим shuffle, то есть перемещение данных между узлами и использование нескольких партиций. (count(), show(), repartititon())
Как снизить shuffle
Shuffle можно уменьшить за счёт broadcast join, фильтрации до wide операций, правильного partitioning, bucketing и настройки spark.sql.shuffle.partitions.
Форматы и их преимущества для работы с большими данными
Parquet — колоночный формат, который отлично подходит для аналитики и хранения больших объёмов данных в data lake. Он эффективно сжимает данные и позволяет быстро читать только нужные колонки, что экономит ресурсы.
ORC (Optimized Row Columnar) — тоже колоночный формат, часто используется в экосистеме Hadoop и Hive. Он особенно хорош для хранения больших таблиц и иногда даёт лучшее сжатие, чем Parquet.
Avro — строчный формат, который хранит схему данных вместе с самими данными. Он удобен для потоковой передачи данных и обмена между системами, например через Kafka.
Feather — лёгкий бинарный формат для быстрой работы с данными в памяти, особенно в Python и R. Подходит для аналитики в локальных или in-memory задачах, но не для распределённых хранилищ больших объёмов.
CSV и JSON — текстовые форматы, универсальные и простые для обмена. Но они медленные для обработки больших объёмов данных и плохо сжимаются, поэтому не подходят для масштабной аналитики.
CDC что это и как реализовать?
CDC — это механизм репликации изменений данных, который позволяет получать поток insert/update/delete операций из источника данных.
В production чаще всего используется log-based CDC, где система непрерывно читает журнал транзакций базы данных (например, WAL или binlog), начиная с сохранённой позиции. Это обеспечивает низкую латентность, целостность данных и минимальную нагрузку на БД.
Реализация через триггеры возможна, но обычно используется только в legacy-системах из-за высокой нагрузки и сложностей с масштабированием.
Различие postgres, mysql, oracle
Если проект стартап / средний бизнес: PostgreSQL — лучший выбор (мощный, бесплатный, масштабируемый).
Если простая веб-приложение / минимальные ресурсы: MySQL/MariaDB.
Если крупный банк или критическая OLTP система: Oracle (или PostgreSQL с enterprise настройками, если бюджет ограничен).
Когда партицирование оправдано?
Партиционируем, если выполняются хотя бы 2 пункта:
- таблица > 5–10 GB
- фильтрация по одному ключу
- регулярное удаление старых данных
Когда использовать партицирование по hash?
Высчитывает хэш по колонке и разбивает значения по этому хэшу.
Хорошо подходит, если создаем хэш по партициям. Оправдано, если нет колонки для фиксации времени и если в фильтре часто используем айдюк