Apache Spark — это унифицированный движок для обработки больших данных. Благодаря нему вычисления выполняются в несколько раз быстрее, чем на устаревших движках. Apache Spark умеет сам выполнять пакетную обработку, потоковую аналитику и SQL-запросы.
Инженер данных использует Spark для разных задач — например, для построения сложных конвейеров, объединения обработки и поддержки аналитики. Расскажем об этом подробнее.
Большие данные изучают на курсе «Инженер данных с нуля». На нём за 11 месяцев учат разрабатывать архитектуру данных: Python, SQL, витрины и хранилища данных, проектирование пайплайнов. После обучения студенты получают диплом о профессиональной переподготовке.
У Apache Spark есть несколько технических особенностей, полезных при обработке больших данных. Эти возможности касаются универсальности движка, работы с ограниченной памятью и поддержки разных языков программирования. Краткое описание таких преимуществ приведено в таблице.
По сути, Apache Spark — это фреймворк для распределённых вычислений. Он разбивает одну задачу на множество мелких частей и отправляет их на разные компьютеры в кластере. Каждая машина обрабатывает свой кусок информации независимо от других.
Затем результаты собираются воедино. Такой подход помогает работать с объёмами информации, которые не влезают на один сервер. При этом код пишется так же просто, как для обычной программы.
DataFrame — это основная структура данных в Spark. Она похожа на таблицу в базе данных или электронную таблицу Excel: столбцы с именами и строки с записями. DataFrame отличается от обычных коллекций тем, что данные распределены по всему кластеру.
С DataFrame можно выполнять типовые операции: например, фильтрацию строк, выборку столбцов, группировку и объединение таблиц. Spark автоматически оптимизирует порядок выполнения этих операций.
Partitioning — это разбиение DataFrame на логические куски, которые называются партициями. Каждая партиция обрабатывается на отдельном ядре процессора или на отдельной машине. Количество партиций определяет степень параллелизма.
По умолчанию Spark создаёт 200 партиций. Это число можно менять вручную. Слишком мало партиций загружает не все ядра, слишком много — создаёт лишние накладные расходы на управление.
Правильный выбор числа партиций ускоряет обработку. Например, для данных на 100 Гб лучше использовать 500–1000 партиций. Указывать количество партиций можно при чтении файла или после операции группировки.
Shuffle — это перераспределение данных между партициями. Процесс возникает при операциях, которым нужно сгруппировать значения по ключу или отсортировать записи. Например, при вызове groupBy или orderBy Spark вынужден перемещать строки с одного компьютера на другой.
Shuffle считается самой дорогой операцией. Данные записываются на диск, передаются по сети и снова читаются в память. Это занимает время и нагружает сеть и жёсткие диски.
Чем больше данных перемещается, тем дольше выполняется задача. Избежать shuffle полностью нельзя, но можно уменьшить его объём. Один из способов — фильтровать данные до группировки, чтобы перемещать меньше строк.
Большие данные изучают на курсе «Инженер данных с нуля». На нём за 11 месяцев учат разрабатывать архитектуру данных: Python, SQL, витрины и хранилища данных, проектирование пайплайнов. После обучения студенты получают диплом о профессиональной переподготовке.
Настройка производительности Spark начинается с анализа самых медленных операций. Чаще всего узким местом становится перетасовка данных между узлами, то есть shuffle. Ниже перечислены три основных способа ускорить выполнение задач.
Помимо этого, следите за параллелизмом через веб-интерфейс Spark UI. Там видно, какие стадии задачи выполняются дольше всего и сколько данных перемещается при shuffle. Ещё одна практика — фильтровать записи как можно раньше, до дорогих операций перегруппировки. Такой порядок действий уменьшает количество строк, которые попадают в shuffle.
Читать также: