Apache Spark со Scala - устойчивый распределенный набор данных

Опубликовано: 18 Февраля, 2022

В современном мире мы ежедневно имеем дело с огромными наборами данных. Данные растут даже быстрее, чем скорость обработки. Выполнение вычислений на таких больших данных часто достигается с помощью распределенных систем. Распределенная система состоит из кластеров (узлов / сетевых компьютеров), которые запускают процессы параллельно и при необходимости обмениваются данными друг с другом.

Apache Spark - это единый аналитический движок для крупномасштабной обработки данных. Он предоставляет высокоуровневые API-интерфейсы на Java, Scala, Python и R, а также оптимизированный движок, поддерживающий общие графики выполнения. Этот богатый набор функций и библиотек поддерживает инструменты более высокого уровня, такие как Spark SQL для SQL и обработки структурированных данных, MLlib для машинного обучения, GraphX для обработки графов и структурированную потоковую передачу для инкрементных вычислений и потоковой обработки. В этой статье мы будем изучать Apache Spark (версия 2.x) с помощью Scala.

Некоторые основные понятия:

  1. RDD (Resilient Distributed Dataset) - это неизменяемая распределенная коллекция объектов. В случае RDD набор данных является основной частью и разделен на логические разделы.
  2. SparkSession - точка входа в программирование Spark с помощью Dataset и DataFrame API.

Мы будем использовать Scala IDE только в демонстрационных целях. Для выполнения приведенного ниже кода требуется специальный компилятор Spark. Перейдите по ссылке, чтобы запустить приведенный ниже код.

Давайте создадим наш первый фрейм данных в Spark.

Scala

// Importing SparkSession
import org.apache.spark.sql.SparkSession
  
// Creating SparkSession object
val sparkSession = SparkSession.builder()
                   .appName("My First Spark Application")
                   .master("local").getOrCreate()
  
// Loading sparkContext
val sparkContext = sparkSession.sparkContext
  
// Creating an RDD 
val intArray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  
// parallelize method creates partitions, which additionally 
// takes integer argument to specifies the number of partitions. 
// Here we are using 3 partitions.
  
val intRDD = sparkContext.parallelize(intArray, 3)
  
// Printing number of partitions
println(s"Number of partitons in intRDD : ${intRDD.partitions.size}")
  
// Printing first element of RDD
println(s"First element in intRDD : ${intRDD.first}")
  
// Creating string from RDD
// take(n) function is used to fetch n elements from 
// RDD and returns an Array.
// Then we will convert the Array to string using 
// mkString function in scala.
val strFromRDD = intRDD.take(intRDD.count.toInt).mkString(", ")
println(s"String from intRDD : ${strFromRDD}")
  
// Printing contents of RDD
// collect function is used to retrieve all the data in an RDD.
println("Printing intRDD: ")
intRDD.collect().foreach(println)


Выход :

 Количество разделов в intRDD: 3
Первый элемент в intRDD: 1
Строка из intRDD: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Печать intRDD: 
1
2
3
4
5
6
7
8
9
10