Spark Flashcards
Что это простыми словами
TODO
Архитектура
TODO
Трансформации, Действия, Ленивые вычисления
Трансформации преобразуют данные (агрегируют, фильтруют и пр.).
Действия возвращают результат (печатают в консоли первые 5 строк, сохраняют в файл и пр.).
Lazy evaluation – трансформации будут выполнены только в момент вызова Action (действия). Это нужно, чтобы можно было логически делить код на понятные шаги, а спарк “под капотом” менял порядок шагов и выполнял вместе. За это отвечает оптимизатор Catalyst.
Такая оптимизация уменьшает количество чтений данных с диска, упрощает вычисления с сохранением логики, пропускает данные, которые не нужны для получения результата.
Shuffle, partitionBy, широкие и узкие трансформации
Спарк выполняет вычисления на кластере – группе серверов, соединённых сетью. Передача данных по сети (shuffle) это дополнительный шаг, который нужен не для всех трансформаций. Но для того, чтобы вернуть правильный результат, иногда это необходимо.
Например, прежде чем вычислять средний чек по магазинам за месяц, нужно все данные за этот один месяц переместить на один узел, а уже потом агрегировать. И так по каждому месяцу данные физически перераскладываются по разным серверам. Контролировать распределение данных можно через partitionBy.
Широкие трансформации могут требовать передать данные по сети, узкие выполняются на одном узле над одной партицией.
Зачастую оптимизация заключается в уменьшении числа широких операций до теоретического минимума.
Широкие:
. Intersection
. Distinct
. GroupByKey
. ReduceByKey
. Join
. Repartition
Узкие:
. Map
. Filter
. Union
. Sample
. Coalesce (в случае уменьшения числа партиций, например до 1 партиции на ноду)
Что такое spill
Скорость спарка в основном завязана на вычислениях в оперативной памяти. Если данные не помещаются в ОЗУ, происходит spill – сохранение промежуточных результатов на диск, который в разы медленнее оперативной памяти.
Может происходить как при вычислениях на executor’е, так и при сборе всех результатов на driver. Решение – увеличивать количество кусочков, на которые делятся данные (партиций) или увеличивать лимиты ОЗУ.
Dataframe vs Dataset vs RDD
TODO
Что происходит под капотом при запуске джобы
TODO
Coalesce vs Repartition
TODO
Параллелизм
TODO
UDF
Пользовательские функции, написанные в Spark. Обычно плохо оптимизируются движком при анализе кода, являются плохой практикой. Старайся избегать в production коде, если на Python, только если никак нельзя обойтись стандартными методами и типами данных.
Проблема в том, что для исполнения Python UDF нужно перенести данные к коду и вернуть обратно. Тот же Spark SQL обычно выполняется напрямую на данных (переносит код к данным), поэтому может быть в разы быстрее.
UDF на Scala спрашивают редко. Тоже будет медленнее встроенных трансформаций, но лучше, чем PySpark UDF, т.к. работает напрямую.
Как исправить ошибку OOM (Out of memory)
TODO
Физические типы join
TODO
Pandas vs Spark vs MapReduce
TODO
Как бороться с перекосом данных (data skew)
TODO
Параметры spark submit
TODO
Cache() и Persist()
TODO