В прошлой статье мы говорили про логистическую регрессию в Apache Spark. Сегодня поговорим про общие переменные, которые поддерживает этот фреймворк. Читайте далее про виды общих переменных в Spark, а также про их особенности.
Что такое общие переменные в Spark: основные виды и особенности
Для параллельной обработки данных Apache Spark использует общие переменные, которые позволяют отправить задачу исполнителю в кластере для дальнейшего выполнения более глобальных задач путем разбиения их на подзадачи. Таким образом, общие переменные — это переменные, которые создают одну общую задачу для выполнения более крупных частных задач в кластере. Общие переменные в Spark разделяются на следующие виды:
- широковещательные переменные (broadcast variables);
- аккумуляторные переменные.
Каждый из этих видов мы подробнее рассмотрим далее.
Широковещательные переменные
Широковещательные переменные — это переменные, которые используются для создания копии данных и сохранения ее на всех узлах кластера. Широковещательные переменные позволяют эффективно передавать большие значения, доступные только для чтения, всем рабочим узлам для дальнейшего использования в операциях Spark (например, агрегирование, группировка, сортировка). Широковещательные переменные могут использоваться для передачи больших таблиц поиска (таблицы со структурой ключ/значение, позволяющие выполнять фильтрацию данных). Следующий код на языке Python создает широковещательную переменную и использует ее для возврата широковещательного значения:
words_new = sc.broadcast(["scala", "java", "hadoop", "spark", "akka"]) data = words_new.value print ("Stored data -> %s" % (data)) elem = words_new.value [2] print ("Printing a particular element in RDD -> %s" % (elem))
Как видно из кода, широковещательная переменная имеет атрибут value
, который хранит данные и используется для возврата широковещательного значения (broadcast value) [1].
Аккумуляторные переменные
Аккумуляторные переменные — это переменные, которые используются для записи данных в память. Аккумуляторные переменные вводятся при необходимости организовать счетчик (в зависимости от условия или события). Они применяются с целью отладки для подсчета некоторых событий, возникающих в процессе выполнения какой-либо задачи в кластере. Например, можно использовать аккумулятор для подсчета пустых строк в RDD. Следующий код на языке Python подсчитывает количество пустых строк в наборе RDD и инкрементирует счетчик на единицу при каждой найденной пустой строке [2]:
file = sc.textFile('file_2.csv') blankLines = sc.accumulator(0) #Создаем аккумулятор и инициализируем его нулем def extractCallSigns(line): global blankLines #Получаем доступ к глобальной переменной if (line == ""): blankLines +=1 return line.split(" ") callSigns = file.flatMap(extractCallSigns) callSigns.saveAsTextFile('str.txt') print("Count of empty strings: ", blankLines.value)
Таким образом, благодаря общим переменным, Apache Spark может более эффективно выполнять поставленные задачи в кластере Big Data путем их разбиения на более простые подзадачи, что позволяет значительно экономить память кластера. Все это делает фреймворк Apache Spark весьма полезным средством для Data Scientist’а и разработчика Big Data приложений. В следующей статье мы поговорим про работу с пользовательскими функциями в Spark.
Больше подробностей про применение Apache Spark в проектах анализа больших данных, разработки Big Data приложений и прочих прикладных областях Data Science вы узнаете на практических курсах по Spark в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве:
- Графовые алгоритмы в Apache Spark
- Машинное обучение в Apache Spark
- Потоковая обработка в Apache Spark
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
Источники
- https://coderlessons.com/tutorials/python-technologies/izuchite-pyspark/pyspark-transliatsiia-i-akkumuliator
- К.Харау, Э.Ковински, П.Венделл, М.Захария. Изучаем Spark: молниеносный анализ данных