Introducción

El Streaming Estructurado es una API de alto nivel para el procesamiento de flujos de datos en tiempo real en Apache Spark. Esta API permite trabajar con flujos de datos de manera similar a cómo se trabaja con DataFrames y Datasets, proporcionando una abstracción más sencilla y poderosa para el procesamiento de datos en tiempo real.

Objetivos

  • Comprender los conceptos básicos del Streaming Estructurado.
  • Aprender a configurar y ejecutar aplicaciones de Streaming Estructurado.
  • Realizar operaciones comunes en flujos de datos en tiempo real.
  • Manejar el estado y la tolerancia a fallos en aplicaciones de Streaming Estructurado.

Conceptos Clave

  1. Modelo de Programación

El Streaming Estructurado sigue un modelo de programación basado en DataFrames y Datasets, lo que permite aplicar las mismas operaciones que se utilizan en el procesamiento de datos estáticos a los flujos de datos en tiempo real.

  1. Fuentes de Datos

El Streaming Estructurado puede leer datos de diversas fuentes, como Kafka, sockets TCP, archivos, entre otros.

  1. Sinks

Los resultados del procesamiento de flujos de datos pueden ser escritos a diferentes destinos, como bases de datos, sistemas de archivos, consolas, etc.

  1. Modos de Salida

El Streaming Estructurado soporta tres modos de salida:

  • Append: Solo las nuevas filas de datos se escriben en el sink.
  • Complete: Todo el resultado del procesamiento se escribe en el sink.
  • Update: Solo las filas que han cambiado desde la última ejecución se escriben en el sink.

Ejemplo Práctico

Configuración del Entorno

Antes de comenzar, asegúrate de tener Apache Spark instalado y configurado. Puedes seguir las instrucciones del módulo "Configuración del Entorno Spark" para configurar tu entorno.

Lectura de Datos desde un Socket

A continuación, se muestra un ejemplo de cómo leer datos de un socket TCP y realizar operaciones básicas de procesamiento en tiempo real.

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, split

# Crear una sesión de Spark
spark = SparkSession.builder \
    .appName("StructuredStreamingExample") \
    .getOrCreate()

# Leer datos desde un socket TCP
lines = spark.readStream \
    .format("socket") \
    .option("host", "localhost") \
    .option("port", 9999) \
    .load()

# Dividir las líneas en palabras
words = lines.select(
    explode(
        split(lines.value, " ")
    ).alias("word")
)

# Contar las palabras
wordCounts = words.groupBy("word").count()

# Escribir los resultados en la consola
query = wordCounts.writeStream \
    .outputMode("complete") \
    .format("console") \
    .start()

query.awaitTermination()

Explicación del Código

  1. Crear una sesión de Spark: Se crea una sesión de Spark utilizando SparkSession.builder.
  2. Leer datos desde un socket TCP: Se configura la fuente de datos para leer desde un socket TCP en el host localhost y el puerto 9999.
  3. Dividir las líneas en palabras: Se utiliza la función split para dividir las líneas en palabras y explode para convertir cada palabra en una fila separada.
  4. Contar las palabras: Se agrupan las palabras y se cuentan las ocurrencias de cada una.
  5. Escribir los resultados en la consola: Se configura el sink para escribir los resultados en la consola en modo complete.

Ejercicio Práctico

Ejercicio 1: Contar Palabras desde un Archivo

Modifica el ejemplo anterior para leer datos desde un archivo en lugar de un socket TCP. Utiliza el siguiente archivo de texto como fuente de datos:

data.txt
---------
hello world
hello spark
hello structured streaming

Solución

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, split

# Crear una sesión de Spark
spark = SparkSession.builder \
    .appName("StructuredStreamingFileExample") \
    .getOrCreate()

# Leer datos desde un archivo
lines = spark.readStream \
    .format("text") \
    .option("path", "path/to/data.txt") \
    .load()

# Dividir las líneas en palabras
words = lines.select(
    explode(
        split(lines.value, " ")
    ).alias("word")
)

# Contar las palabras
wordCounts = words.groupBy("word").count()

# Escribir los resultados en la consola
query = wordCounts.writeStream \
    .outputMode("complete") \
    .format("console") \
    .start()

query.awaitTermination()

Explicación de la Solución

  1. Leer datos desde un archivo: Se configura la fuente de datos para leer desde un archivo de texto en lugar de un socket TCP.
  2. Ruta del archivo: Asegúrate de reemplazar "path/to/data.txt" con la ruta real del archivo de texto.

Resumen

En esta sección, hemos aprendido los conceptos básicos del Streaming Estructurado en Apache Spark, cómo configurar y ejecutar aplicaciones de Streaming Estructurado, y cómo realizar operaciones comunes en flujos de datos en tiempo real. También hemos visto un ejemplo práctico y un ejercicio para reforzar los conceptos aprendidos.

En el siguiente módulo, exploraremos Spark MLlib, la biblioteca de aprendizaje automático de Apache Spark.

© Copyright 2024. Todos los derechos reservados