Introducció a Apache Spark

Apache Spark és un motor de processament de dades de codi obert dissenyat per processar grans volums de dades de manera ràpida i eficient. A diferència de Hadoop MapReduce, Spark utilitza la computació en memòria per accelerar les operacions de processament de dades.

Característiques Clau de Spark

  • Velocitat: Utilitza la memòria per a la majoria de les operacions, el que el fa molt més ràpid que Hadoop MapReduce.
  • Facilitat d'ús: Proporciona APIs senzilles en Java, Scala, Python i R.
  • Generalitat: Suporta una àmplia gamma de càrregues de treball, incloent-hi SQL, streaming, machine learning i processament de gràfics.
  • Compatibilitat amb Hadoop: Pot llegir dades des de HDFS, HBase, Cassandra, entre altres.

Arquitectura de Spark

Spark segueix una arquitectura mestre-treballador (master-worker) composta per diversos components clau:

  • Driver Program: El punt d'entrada de l'aplicació Spark. Controla l'execució de les tasques.
  • Cluster Manager: Gestiona els recursos del clúster. Pot ser YARN, Mesos o el propi gestor de recursos de Spark.
  • Executors: Processos que executen les tasques assignades pel Driver Program i emmagatzemen dades en memòria.

Diagrama de l'Arquitectura de Spark

+------------------+
|  Driver Program  |
+--------+---------+
         |
         v
+--------+---------+
|  Cluster Manager |
+--------+---------+
         |
         v
+--------+---------+     +--------+---------+
|      Executor    | ... |      Executor    |
+------------------+     +------------------+

RDDs (Resilient Distributed Datasets)

Els RDDs són la unitat fonamental de dades en Spark. Són col·leccions d'objectes distribuïdes a través d'un clúster que poden ser processades en paral·lel.

Operacions en RDDs

  • Transformacions: Operacions que creen un nou RDD a partir d'un existent (e.g., map, filter).
  • Accions: Operacions que retornen un valor al driver després de processar l'RDD (e.g., collect, count).

Exemple de Transformació i Acció en RDD

from pyspark import SparkContext

sc = SparkContext("local", "Simple App")
data = [1, 2, 3, 4, 5]
rdd = sc.parallelize(data)

# Transformació: multiplicar cada element per 2
transformed_rdd = rdd.map(lambda x: x * 2)

# Acció: recollir els resultats
result = transformed_rdd.collect()
print(result)  # Output: [2, 4, 6, 8, 10]

Spark SQL

Spark SQL permet treballar amb dades estructurades utilitzant el llenguatge SQL. Proporciona el component DataFrame, que és una col·lecció distribuïda de dades organitzada en columnes.

Exemple d'Ús de DataFrame

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("Simple SQL App").getOrCreate()
data = [("Alice", 1), ("Bob", 2), ("Cathy", 3)]
columns = ["Name", "Value"]

df = spark.createDataFrame(data, columns)
df.show()

# Executar una consulta SQL
df.createOrReplaceTempView("people")
sqlDF = spark.sql("SELECT Name FROM people WHERE Value > 1")
sqlDF.show()

Spark Streaming

Spark Streaming permet processar fluxos de dades en temps real. Utilitza DStreams (Discretized Streams), que són seqüències de RDDs.

Exemple de Spark Streaming

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

sc = SparkContext("local[2]", "NetworkWordCount")
ssc = StreamingContext(sc, 1)

lines = ssc.socketTextStream("localhost", 9999)
words = lines.flatMap(lambda line: line.split(" "))
wordCounts = words.map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)

wordCounts.pprint()

ssc.start()
ssc.awaitTermination()

Exercicis Pràctics

Exercici 1: Creació i Transformació d'RDDs

  1. Crea un RDD amb els números del 1 al 10.
  2. Aplica una transformació per obtenir el quadrat de cada número.
  3. Recull i imprimeix els resultats.

Solució

from pyspark import SparkContext

sc = SparkContext("local", "Exercise 1")
data = list(range(1, 11))
rdd = sc.parallelize(data)

# Transformació: quadrat de cada número
squared_rdd = rdd.map(lambda x: x ** 2)

# Acció: recollir els resultats
result = squared_rdd.collect()
print(result)  # Output: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Exercici 2: Ús de DataFrames i Spark SQL

  1. Crea un DataFrame amb una llista de persones i les seves edats.
  2. Filtra les persones que tenen més de 30 anys utilitzant una consulta SQL.
  3. Mostra els resultats.

Solució

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("Exercise 2").getOrCreate()
data = [("Alice", 25), ("Bob", 35), ("Cathy", 45)]
columns = ["Name", "Age"]

df = spark.createDataFrame(data, columns)
df.createOrReplaceTempView("people")

# Consulta SQL per filtrar persones amb més de 30 anys
sqlDF = spark.sql("SELECT Name, Age FROM people WHERE Age > 30")
sqlDF.show()

Resum

En aquesta secció, hem après sobre Apache Spark i la seva arquitectura, incloent-hi els components clau com el Driver Program, el Cluster Manager i els Executors. Hem explorat els RDDs, les seves transformacions i accions, així com l'ús de DataFrames i Spark SQL per treballar amb dades estructurades. També hem vist com processar fluxos de dades en temps real amb Spark Streaming. Finalment, hem reforçat els conceptes amb exercicis pràctics.

En el següent tema, explorarem el processament de fluxos de dades en més detall.

© Copyright 2024. Tots els drets reservats