В прошлый раз мы говорили про механизм сериализации данных в распределенном фреймворке Apache Spark. Сегодня поговорим про управление распределением данных в Spark. Читайте далее про особенности распределения данных в Spark-приложениях для работы с Big Data в параллельной (распределенной) среде.
Особенности распределения данных в Apache Spark
Распределение в Spark — это размещение данных в кластере таким образом, чтобы максимально уменьшить сетевой трафик (объем передаваемой информации через сеть) и, тем самым, увеличить производительность Spark-приложения. Уменьшение сетевого трафика в Spark достигается благодаря уменьшению взаимодействий между узлами в вычислительном кластере путем распределения наборов RDD (Resilient Distributed Dataset) по разделам. Стоит отметить, что распределение данных полезно только в том случае, когда наборы данных многократно используются приложением, то есть совершается большое количество попыток сетевых соединений в кластере [1].

При распределении данных стоит учитывать количество создаваемых для распределения разделов, так как при создании большого их количества может также увеличиться количество взаимодействий между узлами, а значит и сетевой трафик, что может привести к снижению производительности приложения.
Как начать распределение данных в Spark: несколько практических примеров
Для того, чтобы начать работать с распределением данных, необходимо настроить базовую конфигурацию среды выполнения (для запуска Spark-сессии). Следующий код на языке Python задает базовую конфигурацию среды Spark и запускает Spark-сессию:
from pyspark.sql import SparkSession
# В качестве примера используется порт по умолчанию (local)
conf = pyspark.SparkConf().setAppName('appName').setMaster('local')
# Развертывание среды Spark с указанными настройками
sc = pyspark.SparkContext(conf=conf)
# Запуск Spark-сессии
spark = SparkSession(sc)
В качестве объекта распределения фреймворк Spark использует данные наборов RDD, поэтому для осуществления распределения необходимо преобразовывать исходные данные в набор RDD. Следующий код на языке Python отвечает за создание датафрейма и преобразование его в набор RDD c помощью функции rdd:
my_schema=StructType([StructField('id',IntegerType(),True),\
StructField('name',StringType(),True),\
StructField('age',IntegerType(),True),\
StructField('country',StringType(),True),])
data_2=spark.createDataFrame([(1,'Alice',25,'USA'),(2,'John',45,'Canada'),(3,'Michael',37,'USA'),
(4,'John',50,'Canada'),
(5,'Emmet',25,'Canada')],\
['id','name','age','country'],my_schema)
data_2. rdd
По умолчанию нераспределенные данные в Spark имеют один раздел (partition). Для распределения данных необходимо создать больше одного раздела, то есть перераспределить набор данных. За перераспределение данных отвечает метод repartition(), который в качестве параметра принимает число разделов для перераспределения [2]:
data_2.rdd.repartition(10)
После использования метода repartition() может возникнуть «перетасовка» данных, так как при каждом обращении данные случайным образом перераспределяются по разделам, и для того, чтобы найти необходимый раздел, приходится инициировать дополнительные соединения между узлами, что может привести к снижению производительности Spark-приложения. Чтобы избежать этого, необходимо сформировать «устойчивые» разделы, которые будут хранить в себе одинаковые наборы данных при каждом обращении к ним. Для того, чтобы сделать разделы «устойчивыми», необходимо использовать метод persist() при распределении данных [2]:
data_2.rdd.repartition(10).persist()
Таким образом, благодаря механизму распределения данных, фреймворк Spark способен обеспечивать весьма высокую производительность распределенных приложений и задействовать при этом минимум вычислительных мощностей. Это делает фреймворк Apache Spark весьма полезным средством для Data Scientist’а и разработчика распределенных Big Data приложений. В следующей статье мы поговорим про особенности взаимодействия Spark с реляционными СУБД.
Больше подробностей про применение Apache Spark в проектах анализа больших данных, разработки Big Data приложений и прочих прикладных областях Data Science вы узнаете на практических курсах по Spark в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве:
- Графовые алгоритмы в Apache Spark
 - Машинное обучение в Apache Spark
 - Потоковая обработка в Apache Spark
 - Основы Apache Spark для разработчиков
 - Анализ данных с Apache Spark
 
Источники
- К.Харау, Э.Ковински, П.Венделл, М.Захария. Изучаем Spark: молниеносный анализ данных
 - https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html?highlight=partition
 



