Как настроить Spark-приложение и повысить его производительность

Spark, фреймворк, Data Science, конфигурация

Сегодня поговорим о том, как происходит настройка Spark-приложений. Также рассмотрим ключевые факторы, влияющие на производительность приложений, использующих этот фреймворк.

От чего зависит производительность Spark-приложений: 2 главных фактора

Приложения, созданные на базе Apache Spark, имеют базовую конфигурацию, которая осуществляется через специальный класс SparkConf. Он отвечает за базовую конфигурацию приложения и отправляет ее в объект SparkContext, который запускает Spark-сессию внутри исполнителей на рабочих узлах и позволяет использовать методы, работающие с распределенными наборами RDD. Поэтому на производительность Spark-приложений очень влияют следующие факторы:

  • степень параллелизма;
  • аппаратное обеспечение.

Каждый из них мы подробнее рассмотрим далее.

Настройка конфигурации Spark-приложений

Настройка приложений на базе Spark подразумевает настройку конфигурации среды их выполнения. Базовым элементом настройки в Spark является класс SparkConf. Объект SparkConf необходим при создании нового объекта SparkContext. Давайте рассмотрим пример настройки приложения с использованием SparkConf в языке Python:

conf = SparkConf()

conf.set("spark.app.name", "Spark APP")

conf.set("spark.master", "local[4]")

conf.set("spark.ui.port", "36000")

sc = pyspark.SparkContext(conf)

Как мы видим, экземпляр SparkConf представляет собой пару ключ/значение, которые несут в себе информацию о конфигурации. Пользователь может переопределить эту конфигурацию на свое усмотрение. Для того, чтобы воспользоваться объектом SparkConf, его необходимо создать, затем вызвать метод set(), чтобы добавить информацию о конфигурации. Далее следует передать этот объект в конструктор объекта SparkContext. Помимо метода set(), можно также воспользоваться методами setAppName() и setMaster() для изменения значения наших параметров конфигурации:

conf = pyspark.SparkConf().setAppName('appName').setMaster('local')

sc = pyspark.SparkContext(conf=conf)

spark = SparkSession(sc)

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

Apache Spark также имеет возможность определять конфигурацию с помощью сценария spark-submit:

bin/spark-submit \

--class com.example.MyApp \

--master local[4] \

--name "Му Spark Арр" \

--conf spark.ui.port=36000 \ App.py

Мы видим, что в арсенале сценария spark-submit имеется специальный флаг --conf, который принимает любые значения конфигурации.

Степень параллелизма

Степень параллелизма — это количество информации, которое способно обрабатываться одновременно. Мы уже рассказывали, что Spark-приложения в основном работают с распределенными наборами RDD. В процессе выполнения такие данные делятся на множество разделов, каждый из которых содержит в себе подмножество всех данных. Когда Spark начинает планировать и выполнять поставленные задачи, для любого раздела RDD создается по одной задаче, каждая из которых выполняется на одном ядре. Обычно такого параллелизма вполне хватает для быстрой обработки RDD. Однако, при его недостаточной степени некоторые ресурсы Spark просто простаивают и занимают при этом немалую часть аппаратных ресурсов. Напротив, если же степень параллелизма слишком высока, небольшие расходы в каждом разделе могут быть весьма существенны. Для того, чтобы избежать этого, необходимо настроить достаточный параллелизм при работе с RDD. Для этого необходимо объединить разделы в данных, если их количество слишком высоко. Чтобы сделать это, воспользуемся методом coalesce():

my_RDD=sc.textFile('my_rdd_file.csv')

my_RDD.getNumPartitions() ##1500

my_RDD=my_RDD.coalesce(5).cache()

my_RDD.getNumPartitions() ##5

Как мы видим, количество разделов при таком подходе уменьшилось в 300 раз. Это означает, что мы оптимизировали нашу степень параллелизма в данное количество раз.

Аппаратное обеспечение

Аппаратные ресурсы также играют существенную роль в работе Spark-приложений. Основными составляющими оценки кластера являются такие элементы, как:

  • объем памяти, которая выделяется для каждого исполнителя;
  • число ядер для каждого исполнителя;
  • число локальных дисков для хранения данных;
  • общее число исполнителей.

Число исполнителей и ядер в основном зависит от применяемого диспетчера кластера. Например, в Mesos и Standalone Spark будет пытаться захватить настолько много ядер и исполнителей, насколько это будет предложено планировщиком. Spark гарантированно обеспечивает линейное масштабирование. При таком масштабировании удвоение объемов доступных ресурсов приводит к удвоению скорости работы приложения. Spark также облегчает сборку мусора, что приводит к освобождению памяти и увеличению производительности Spark-приложений.

Таким образом, фреймворк Spark способен обеспечивать приложения весьма удобной конфигурацией, которая легко контролируется разработчиком, а также удобным распределением как аппаратных, так и программных ресурсов. Благодаря этому Apache Spark является весьма полезным инструментом для Data Scientist’а и разработчика Big Data приложений. В следующей статье мы поговорим про форматы файлов с данными, которые Spark способен принимать для дальнейшего анализа.

Более подробно про применение Apache Spark в проектах анализа больших данных, разработки Big Data приложений и прочих прикладных областях Data Science вы узнаете на практических курсах по Spark в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.

Записаться на курс

Смотреть раcписание

Добавить комментарий

Поиск по сайту