Как происходит распределение данных в Spark

курсы hadoop sql, big data обучение, bigdata курсы, hadoop spark, анализ с использование spark, bigdata курсы,аналитика больших данных курсы, курсы spark, основы spark, основы hadoop, обучение администраторов spark, spark mllib, spark rdd, spark streaming, apache hadoop, обучение spark sql, курсы spark streaming

В прошлый раз мы говорили про механизм сериализации данных в распределенном фреймворке Apache Spark. Сегодня поговорим про управление распределением данных в Spark. Читайте далее про особенности распределения данных в Spark-приложениях для работы с Big Data в параллельной (распределенной) среде.

Особенности распределения данных в Apache Spark

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

курсы hadoop sql, big data обучение, bigdata курсы, hadoop spark, анализ с использование spark, bigdata курсы,аналитика больших данных курсы, курсы spark, основы spark, основы hadoop, обучение администраторов spark, spark mllib, spark rdd, spark streaming, apache hadoop, обучение spark sql, курсы spark streaming
Распределение данных в Spark

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

Как начать распределение данных в 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 в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве:

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

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

Источники

  1. К.Харау, Э.Ковински, П.Венделл, М.Захария. Изучаем Spark: молниеносный анализ данных
  2. https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html?highlight=partition

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

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