top of page
DelAlmeida

Desmitificando Apache Spark: Una Herramienta Potente para Procesamiento de Datos a Gran Escala - Pyspark

Actualizado: 7 abr

PYSPARK








¿Has oído hablar de Apache Spark pero te parece demasiado complejo? No te preocupes, en realidad es una herramienta poderosa que simplifica el trabajo con grandes volúmenes de datos.

 

En esencia, Spark es un motor de análisis unificado para procesamiento de datos masivos, que ofrece interfaces para programar todo un clúster con tolerancia a fallos y paralelismo de datos implícito. Imagina que tienes que analizar todos los tweets del último año para identificar tendencias; Spark es perfecto para este tipo de tareas.

 

Spark soporta varios lenguajes de programación, como Scala, Python, Java, R y SQL, ofreciendo una flexibilidad increíble. Puedes usar PySpark, que combina la sencillez de Python con el poder de Spark, para desarrollar desde complejas tareas de ingeniería de datos hasta avanzados modelos de aprendizaje automático.





El ecosistema de Spark incluye:


🐍Spark SQL: Para aquellos que aman las consultas SQL, permite ejecutar SQL y trabajar con datos estructurados.

Spark Streaming: Si necesitas procesar datos en tiempo real, como los de las redes sociales o logs de servidores, Spark Streaming es la solución.

🐍MLlib: La librería de aprendizaje automático de Spark, para aplicar algoritmos de ML de forma distribuida.

🐍GraphX: Para el análisis de grafos y cálculos a gran escala.

Antes de Spark 2.0, la interfaz principal era el Resilient Distributed Dataset (RDD), pero ahora tenemos los DataFrames y Datasets, que son más eficientes y fáciles de usar.



Si alguna vez has pensado que trabajar con big data es solo para expertos, Spark te demuestra lo contrario. Con una comunidad robusta y una curva de aprendizaje accesible, Spark está al alcance de todos. ¡Así que no temas dar el primer paso hacia el dominio de los datos a gran escala!

 

 

Apache Spark es una poderosa herramienta para el procesamiento de datos a gran escala, diseñada para ser rápida y eficiente.



🟢Algunos de sus componentes y conceptos:


✔️Spark Master y Workers:


Imagina que Spark es como una orquesta. El Master (maestro) es como el director, y los Workers (trabajadores) son los músicos. El director decide qué músico toca qué parte de la pieza, y los músicos hacen el trabajo.

 

✔️Spark Context y Spark Session:


Estos son como tu pase de acceso a Spark. Si quieres trabajar con Spark, necesitas uno de estos. Piénsalos como una llave que abre la puerta a todas las increíbles herramientas que Spark tiene para ofrecer.

 

✔️DAG (Directed Acyclic Graph) Visualization:


Cada vez que haces un trabajo en Spark, como filtrar datos o contar cosas, Spark lo organiza en un gráfico que muestra todos los pasos que se seguirán. DAG es como un mapa que Spark utiliza para no perderse y hacer las cosas de manera eficiente.

 

✔️Spark SQL, Streaming, MLlib, y GraphX:


Estos son como kits de herramientas especializados en Spark. ¿Quieres hacer análisis con consultas SQL? Usa Spark SQL.

¿Quieres analizar datos que se generan en tiempo real, como tweets o actualizaciones de stock? Ahí está Spark Streaming.

¿Te interesa el aprendizaje automático o quieres trabajar con gráficos y redes? MLlib y GraphX son para ti.

 

✔️Jupyter Notebook:


Es un cuaderno de notas digital donde puedes escribir y ejecutar tu código Spark. Lo mejor es que puedes ver los resultados directamente allí y hasta compartirlo con otros.

 

Entender Spark no es complicado. Es como aprender a conducir: al principio parece mucho, pero una vez que conoces los controles y para qué sirve cada cosa, se convierte en una herramienta valiosa y poderosa para lidiar con el mundo de los datos.



🟢¿Qué es PySpark?


PySpark es la intersección de Python y Apache Spark. Apache Spark es una plataforma de análisis unificada que maneja procesamiento de datos a gran escala, y PySpark es su interfaz que permite la programación con Python. Imagina tener la capacidad de procesar datos como si estuvieras manejando una supercomputadora, ¡eso es PySpark!


 

🟢¿Cómo se ejecuta PySpark?

 

Puedes ejecutar programas de Spark de cuatro maneras:

 

✔️Local: Ejecuta todo en tu máquina, ideal para aprender y experimentar.


✔️Standalone: Configura tu propio clúster en tu red local o máquinas.


✔️YARN (Yet Another Resource Negotiator): Para ejecutar en clústers de Hadoop, gestionando recursos de manera eficiente.


✔️Mesos: Otra forma de administrar recursos en clústers, más flexible que YARN.







Operaciones en PySpark: Transformaciones y Acciones:







En PySpark, operamos con dos tipos de funciones:

 

🐍Transformaciones: como el artista que esboza y modifica su dibujo, pero no lo revela todavía. PySpark no ejecuta estas transformaciones hasta que sea absolutamente necesario. Ejemplos incluyen map, filter y groupByKey.

 

🐍Acciones: son como decir "¡Ta-da!", revelando el resultado final de todos los esbozos (transformaciones). Ejemplos incluyen count, collect y saveAsTextFile.

 


¿Por qué es importante saber esto?


Entender PySpark y su funcionamiento te prepara para manejar 'big data' y extracción de conocimiento a una escala impresionante. No solo es una habilidad técnica deseada en el mercado laboral, sino que también te capacita para descubrir patrones y tomar decisiones basadas en datos masivos.


Transformaciones Spark


1.º

Imagina que quieres iniciar un proyecto de ciencia de datos con PySpark.

Lo primero que necesitas es crear una sesión de Spark, el corazón de tu operación de procesamiento de datos.


🟩Aquí te muestro cómo se hace en código y qué significa cada parte:


from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('abc').getOrCreate()

 

from pyspark.sql import SparkSession: Aquí estamos importando la clase SparkSession, que es como el punto de entrada para trabajar con funcionalidades de Spark SQL.

SparkSession.builder: Este es el constructor para tu sesión. Piensa en ello como el arquitecto que está listo para diseñar tu proyecto.

.appName('abc'): Aquí le damos un nombre a nuestra aplicación Spark. Es como ponerle un letrero a tu edificio de datos para que todos sepan cómo se llama.

.getOrCreate(): Finalmente, con este método creamos la sesión. Si ya existe una sesión con el mismo nombre, la usará, si no, creará una nueva. Es como decir, "Necesito un espacio para trabajar con mis datos. Si ya hay uno, lo uso, si no, construye uno nuevo".

 

🟩¿Qué aporta a tu trabajo?


Al iniciar una SparkSession, estás preparar todo lo necesario para comenzar tu análisis de datos. Desde aquí, puedes leer y escribir datos, realizar transformaciones y llevar a cabo acciones complejas de datos. Es el primer paso esencial para convertirte en un maestro del manejo de 'big data'.



2.º

En el viaje por el mundo del procesamiento de datos distribuidos con Spark, una pieza fundamental es el contexto de Spark, también conocido como SparkContext. 


🟩Aquí te muestro cómo se establece y qué papel juega en tus proyectos:


from pyspark.context import SparkContext

sc = SparkContext('local', 'test')

 

from pyspark.context import SparkContext: Esto importa la clase SparkContext, que es tu enlace directo a la ejecución de operaciones en un cluster. Puedes pensar en esto como obtener las llaves del coche de carreras que es Spark.

 

sc = SparkContext('local', 'test'): Aquí, estás inicializando tu contexto de Spark. El primer argumento, 'local', indica que Spark se ejecutará en tu máquina local. El segundo argumento, 'test', es simplemente el nombre de tu aplicación, dándote una forma de identificarla cuando se ejecute.

 

🟩¿Qué significa esto para tus proyectos?


Establecer un SparkContext es como arrancar los motores de tu procesamiento de datos. Es el primer paso antes de sumergirte en la manipulación de grandes volúmenes de información, permitiéndote luego realizar operaciones como cargar datos, procesarlos y analizarlos a una escala que sería difícil de manejar en un sistema convencional. Es, en esencia, lo que transforma tu ordenador en una potente herramienta de análisis de big data.


Más Transformaciones en Apache Spark:

La Transformación Map


3.º

En el ecosistema de Spark, las transformaciones son operaciones que nos permiten procesar los datos de los RDD (Resilient Distributed Datasets). Una de las más fundamentales y poderosas es la transformación map.

 

🟩¿Qué es map?

La transformación map toma cada elemento de un RDD y le aplica una función, devolviendo un nuevo RDD como resultado. Es como una línea de ensamblaje en una fábrica: tomas una pieza (elemento), le haces algo (función) y obtienes un producto modificado al final.

 

 

🟩Ejemplo Práctico:

 

Imagina que tienes una lista de letras y quieres contarlas:

 

from pyspark.sql import SparkSession

 

- Inicializamos la sesión de Spark

spark = SparkSession.builder.appName('abc').getOrCreate()

 

- Creamos un contexto de Spark

sc = spark.sparkContext

 

- Creamos un RDD con una lista simple

rdd1 = sc.parallelize(["b", "a", "c"])

 

- Recolectamos y mostramos el RDD original

rdd1.collect()


-- Salida: ['b', 'a', 'c']

 

- Usamos map para transformar cada elemento en una tupla, asignándole el valor 1

mapRdd = rdd1.map(lambda x: (x, 1))

 

- Recolectamos y mostramos el nuevo RDD transformado

mapRdd.collect()


-- Salida: [('b', 1), ('a', 1), ('c', 1)]

 

 

Con map, hemos aplicado una función lambda sencilla que toma cada elemento x (en este caso, cada letra) y lo convierte en una tupla (x, 1). Esto podría ser el primer paso para una operación de conteo, donde 1 representa una sola ocurrencia de la letra.

 

🟩Conclusión:

La transformación map es una herramienta versátil y eficiente para el preprocesamiento de datos. Es esencial para entender y aprovechar el potencial de Spark en el procesamiento de datos a gran escala.



En Apache Spark, una transformación crucial que frecuentemente utilizamos es filter.


4.º


Esta operación nos permite quedarnos solo con los elementos de un RDD que cumplen con una condición específica.

 

🟩¿Qué hace filter?

Piensa en filter como un colador de cocina. Imagina que tienes un cuenco de frutas y quieres separar solo las manzanas. Usas un colador que solo deja pasar las manzanas y retiene el resto de las frutas. De manera similar, la transformación filter en Spark deja "pasar" solo aquellos elementos que cumplen con un criterio y "retiene" los que no.

 

🟩Ejemplo Práctico:

 

Supongamos que tienes un conjunto de números y quieres filtrar solo los números pares. Aquí te muestro cómo lo harías en Spark:

 

from pyspark.sql import SparkSession

 

- Creamos una sesión de Spark para nuestro ejemplo

spark = SparkSession.builder.appName('FilterTransformation').getOrCreate()

 

- Obtenemos el contexto de Spark

sc = spark.sparkContext

 

- Creamos un RDD con números del 1 al 5

rdd = sc.parallelize([1, 2, 3, 4, 5])

 

- Aplicamos filter para obtener solo los números pares

filterRDD = rdd.filter(lambda x: x % 2 == 0)

 

- Recolectamos los resultados y los mostramos

filterRDD.collect()


-- Salida esperada: [2, 4]

 

En nuestro código, la función filter aplica una condición simple: lambda x: x % 2 == 0. Esto significa que para cada elemento x en nuestro RDD, queremos que solo se "filte" y se mantenga en el nuevo RDD si x dividido entre 2 tiene un residuo de 0, lo cual es la definición de un número par.

 

🟩Conclusión:

La transformación filter es fundamental para trabajar con grandes volúmenes de datos cuando necesitamos refinar y seleccionar solo la información relevante para nuestros análisis o tareas posteriores.


🐍Diferencia entre Map y flatMap en Apache Spark:


En Spark, las transformaciones map y flatMap son herramientas poderosas para procesar datos, pero es importante entender su diferencia para utilizarlas correctamente:

 

Map: La transformación map se utiliza para aplicar una función a cada elemento en el RDD, resultando en un nuevo RDD de la misma longitud. Cada entrada en el RDD original se transforma en exactamente una salida.

Por ejemplo, si tenemos un RDD con palabras, podríamos usar map para crear un nuevo RDD donde cada palabra esté en mayúscula.

 

flatMap: A diferencia de map, flatMap puede producir cero, uno o más elementos de salida para cada elemento de entrada. Es decir, flatMap aplana el resultado. Si tienes un RDD con frases, y usas flatMap para dividir las frases en palabras, obtendrás un RDD con todas las palabras individualmente, no importa en cuántas frases estaban originalmente.

 

🟩En resumen:

Utiliza map cuando quieras mantener uno-a-uno la relación entre entrada y salida. Elige flatMap cuando quieras "aplanar" las listas de listas en una sola lista de elementos.





Transformación de Unión en Apache Spark


5.º


En Apache Spark, la operación de unión permite combinar dos RDDs para que podamos trabajar con ellos como si fueran uno solo.

La operación unión no elimina duplicados; los elementos de ambos RDDs se conservan en el RDD resultante.

 

🟩Aquí tienes un ejemplo sencillo para ilustrar cómo se puede usar la transformación union en Spark:

 

from pyspark.sql import SparkSession

 

- Inicializamos la sesión de Spark.

spark = SparkSession.builder.appName('UnionTransformation').getOrCreate()

sc = spark.sparkContext

 

- Creamos un archivo de texto y escribimos en él la palabra "Hello".

import os

path = os.path.join("/ruta/a/tu/directorio", "union-text.txt")

with open(path, "w") as testFile:

    testFile.write("Hello")

 

- Creamos un RDD a partir del archivo de texto.

textFile = sc.textFile(path)

 

- Creamos otro RDD a partir de una lista que contiene la palabra "World!".

parallelized = sc.parallelize(["World!"])

 

- Unimos ambos RDDs y coleccionamos los resultados.

unionResult = sc.union([textFile, parallelized]).collect()

 

- Mostramos los elementos del RDD resultante ordenados.

print(sorted(unionResult))

 

Resultado:

 

['Hello', 'World!']

 

En este código, primero creamos un archivo de texto que contiene la palabra "Hello" y luego lo leemos en un RDD. Posteriormente, creamos otro RDD con la palabra "World!". Utilizamos union para unir ambos RDDs y finalmente mostramos el resultado ordenado, que nos devuelve las palabras "Hello" y "World!" en una lista.

 

🟩Este ejemplo muestra cómo se pueden unir datos de diferentes fuentes de una forma que es a la vez poderosa y fácil de entender.




La transformación intersection en Apache Spark es utilizada para encontrar elementos comunes entre dos RDDs.


6.º


El resultado es un nuevo RDD que solo contiene aquellos elementos que están presentes en ambos RDDs de entrada.

 

Veamos cómo se aplica esto con un ejemplo:

from pyspark.sql import SparkSession

 

- Iniciamos una sesión de Spark.

spark = SparkSession.builder.appName('IntersectionTransformation').getOrCreate()

sc = spark.sparkContext

 

- Creamos dos RDDs con algunos números.

rdd1 = sc.parallelize([1, 10, 2, 3, 4, 5])

rdd2 = sc.parallelize([1, 6, 2, 3, 7, 8])

 

-Aplicamos la transformación de intersección para encontrar elementos comunes.

intersectedRDD = rdd1.intersection(rdd2).collect()

 

- Mostramos el resultado.


print(intersectedRDD)

 

Resultado:

[1, 2, 3]

 

En el ejemplo, rdd1 contiene los números [1, 10, 2, 3, 4, 5] y rdd2 contiene [1, 6, 2, 3, 7, 8]. La intersección de estos dos RDDs es [1, 2, 3], que son los números que aparecen en ambos RDDs. El método collect() se utiliza para traer los datos del RDD al driver y poder mostrarlos o utilizarlos localmente.

 

🟩Esta operación es especialmente útil cuando necesitas filtrar datos redundantes o cuando quieres identificar un conjunto de elementos que cumplen con ciertos criterios en diferentes conjuntos de datos.

 

La transformación distinct en Apache Spark se utiliza para eliminar duplicados de un RDD. 


7.º


Es decir, si tienes elementos repetidos en tu conjunto de datos, distinct creará un nuevo RDD con cada elemento apareciendo una sola vez.

 

🟩Aquí tienes un ejemplo simplificado y cómo podrías explicarlo:

 

from pyspark.sql import SparkSession

 

- Iniciamos una sesión de Spark.

spark = SparkSession.builder.appName('DistinctTransformation').getOrCreate()

sc = spark.sparkContext

 

- Creamos un RDD con algunos números, incluyendo duplicados.

rdd = sc.parallelize([1, 1, 2, 3])

 

- Utilizamos la transformación `distinct` para eliminar duplicados.

distinctRDD = rdd.distinct().collect()

 

- Ordenamos el resultado para mejor visualización y lo imprimimos.

print(sorted(distinctRDD))Resultado:

[1, 2, 3]

 

En este ejemplo, empezamos con un RDD que tiene los valores [1, 1, 2, 3]. Observa que el número 1 está duplicado. Después de aplicar la transformación distinct, obtenemos un nuevo RDD con los valores [1, 2, 3] sin duplicados.

La función collect se usa para traer los datos del RDD procesado de vuelta a la memoria local y poder imprimirlos. Utilizamos sorted para asegurarnos de que el resultado esté ordenado antes de imprimirlo.

 

🟩La operación distinct es muy útil para la limpieza de datos y para prepararlos para análisis posteriores donde las repeticiones pueden sesgar o invalidar los resultados. Puedes mencionar en tu artículo que esta es una herramienta fundamental para garantizar la calidad y precisión en el procesamiento y análisis de grandes conjuntos de datos con Spark.



 

 La transformación reduceByKey en Spark 


8.º

 

La transformación reduceByKey en Spark es particularmente útil para procesar pares clave-valor. Lo que hace es agrupar todos los valores asociados con la misma clave y luego aplicar una función de reducción (como la suma) a todos los valores de cada clave, reduciéndolos a un solo valor por clave.

 

🟩Ejemplo:

from pyspark.sql import SparkSession

from operator import add

 

- Iniciamos la sesión de Spark.

spark = SparkSession.builder.appName('reduceByKeyTransformation').getOrCreate()

sc = spark.sparkContext

 

- Creamos un RDD con pares clave-valor, donde algunas claves están repetidas.

rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])

 

- Utilizamos `reduceByKey` para sumar los valores de cada clave.

- La función `add` importada del módulo `operator` se utiliza como función de reducción.

result = rdd.reduceByKey(add).collect()

 

- Ordenamos el resultado para su presentación y lo imprimimos.

print(sorted(result))

 

 

Resultado:


[('a', 2), ('b', 1)]

 

El RDD inicial contiene tres elementos: dos con la clave 'a' y uno con la clave 'b'. Al aplicar reduceByKey, se suman los valores para las claves iguales. Así, obtenemos que la suma de los valores para la clave 'a' es 2 (1+1) y para la clave 'b' es 1 (ya que solo hay un valor). Finalmente, se recolectan y ordenan los resultados para mostrar que cada clave tiene un solo valor asociado, que es la suma de sus valores originales.

 


 La transformación repartition en Spark  


9.º

La transformación repartition en Spark es utilizada para aumentar o disminuir el número de particiones en las que un RDD está dividido.

Esta operación puede ser necesaria para optimizar las tareas de transformación y acción en términos de paralelismo y distribución de datos. Sin embargo, hay que tener en cuenta que repartition puede implicar un costo computacional significativo, ya que involucra el movimiento de datos a través de los nodos del clúster.

 

🟩Ejemplo:

 

from pyspark.sql import SparkSession

 

- Iniciamos la sesión de Spark.

spark = SparkSession.builder.appName('repartitionTransformation').getOrCreate()

sc = spark.sparkContext

 

- Creamos un RDD con números del 1 al 7 y lo distribuimos en 4 particiones.

rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7], 4)

 

- Observamos cómo están distribuidos los datos en las particiones originales.

print('Distribución original de datos en las particiones:', sorted(rdd.glom().collect()))

 

- Cambiamos la cantidad de particiones a 2.

rdd_repartitioned_2 = rdd.repartition(2)

 

- Observamos la cantidad de particiones después del repartition a 2.

print('Cantidad de particiones después del repartition a 2:', len(rdd_repartitioned_2.glom().collect()))

 

- Cambiamos la cantidad de particiones a 10.

rdd_repartitioned_10 = rdd.repartition(10)

 

- Observamos la cantidad de particiones después del repartition a 10.

print('Cantidad de particiones después del repartition a 10:', len(rdd_repartitioned_10.glom().collect()))

 

En este caso, la llamada glom() es utilizada para inspeccionar los datos dentro de cada partición. Al recolectarlos con collect(), podemos ver la distribución actual de los datos.

 

La primera línea sorted(rdd.glom().collect()) mostrará cómo se distribuyen los datos en las 4 particiones originales.

 

Después, se reparte el RDD a sólo 2 particiones con rdd.repartition(2), lo cual podría ser útil si quisiéramos reducir el paralelismo para operaciones que no necesitan tantas particiones o cuando estamos preparando los datos para escribirlos en un almacenamiento que funciona mejor con menos archivos más grandes.

 

Finalmente, con rdd.repartition(10), se incrementa el número de particiones a 10. Esto se podría utilizar para aumentar el paralelismo en operaciones subsiguientes, como podría ser necesario si estamos por ejecutar una operación que se beneficia de un mayor paralelismo (por ejemplo, un filtro o un join con otro gran RDD).

 

🟩Cabe destacar que si bien el aumento en el número de particiones puede ayudar a mejorar la utilización de recursos y la paralelización de tareas en un clúster, también puede llevar a una sobrecarga por el aumento en la comunicación entre nodos si el número de particiones es excesivamente alto en comparación con la cantidad de datos.

 


SPARK Dataframe:


En este segmento exploramos la versatilidad de los DataFrames en PySpark, una estructura de datos optimizada que facilita el manejo de grandes volúmenes de información, permitiendo aprovechar la potencia de Spark para realizar análisis complejos de manera eficiente y con un estilo de programación familiar para quienes ya trabajan con bases de datos relacionales o Pandas en Python.

 

Ejemplo:

 

1.     Creación de la sesión de Spark:

 

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('CreatingDataframe').getOrCreate()

 

Aquí estamos importando SparkSession y creando una nueva sesión de Spark con el nombre de aplicación 'CreatingDataframe'. Esta sesión es la puerta de entrada para trabajar con funcionalidades de Spark SQL, como los DataFrames.

 

2.     Lectura del DataFrame:

 

df = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("/Users/renata/Downloads/Spark_Training/HospInfo.csv")

 

Esto lee un archivo CSV en un DataFrame. La opción "header", "true" indica que la primera fila contiene nombres de columna y "inferSchema", "true" le dice a Spark que deduzca automáticamente los tipos de datos de las columnas.

 

3.     Visualización de los datos:

 


El método show(5) muestra las primeras 5 filas del DataFrame. Es similar a head() en Pandas y es útil para obtener una vista rápida de los datos.


4.     Conteo de filas:

 

df.count()

 

Este método cuenta el número total de filas en el DataFrame. En tu caso, la salida fue 14436, indicando que hay 14436 filas.

 

5.     Colección de datos:

 

df.collect()


El método collect() recupera todas las filas del DataFrame y las trae al driver de Spark en forma de lista de objetos Row. Este método se debe usar con precaución si estás trabajando con grandes conjuntos de datos, ya que puede causar un desbordamiento de memoria si el conjunto de datos es demasiado grande para caber en la memoria del driver.

El resultado de este método es una lista de todas las filas del DataFrame, que puedes iterar y procesar como necesites.

 

 

6.  El método take(n) en PySpark funciona de manera similar al método show(n), pero en lugar de simplemente imprimir los resultados en la consola, take(n) devuelve las primeras n filas como una lista de objetos Row.

 

Por ejemplo:


df.take(5)

 

Esto retornaría una lista con las primeras cinco filas del DataFrame. Es útil cuando quieres trabajar programáticamente con una muestra de datos en lugar de solo visualizarlos.




Accediendo a Spark UI:

 

Apache Spark ofrece una suite de interfaces de usuario (UI) para monitorear el estado y el consumo de recursos de tu clúster de Spark.

 

Dentro de Spark UI encontrarás pestañas como:


🐍Trabajos (Jobs): Muestra una página de resumen de todos los trabajos de Spark y detalles de cada uno.

🐍Etapas (Stages): Ofrece detalles del estado actual de todas las etapas de los trabajos de Spark.

🐍Almacenamiento (Storage): Exhibe los RDDs y DataFrames persistidos, si los hay, en la aplicación.

🐍Entorno (Environment): Muestra los valores de diferentes variables de entorno y configuraciones.

🐍Ejecutores (Executors): Información resumida sobre los ejecutores creados para la aplicación, incluyendo uso de memoria y de disco.

🐍SQL: Si ejecutas consultas SQL con Spark, aquí podrás ver información detallada sobre estas.

 

Spark UI es accesible mediante http://<ip-address>:4040.




 

 

Spark-submit

 

El comando spark-submit es una utilidad para ejecutar aplicaciones de Spark o PySpark en un clúster, especificando opciones y configuraciones. Esta herramienta es compatible con diversos gestores de clústeres como YARN, Mesos, Kubernetes y Stand-alone.

 

🐍Por ejemplo, el siguiente comando es una forma de utilizar spark-submit:

 

spark-submit --master <master-url> --deploy-mode <deploy-mode> [otras opciones] <tu-aplicacion.py>

 

Modos de Despliegue (Deployment Modes)

 

🐍Al usar --deploy-mode, especificas dónde se ejecutará el programa controlador (driver) de tu aplicación de Spark. Puede ser en modo clúster o en modo cliente, adecuado para trabajos interactivos y de depuración.

 

Gestores de Clúster (Cluster Managers)

 

🐍Con --master, defines qué gestor de clúster utilizar para ejecutar tu aplicación.

Spark soporta varios, incluyendo:

 

YARN: Si tus recursos de clúster están gestionados por Hadoop YARN.

Mesos: Utilizando la dirección mesos://HOST:PORT.

Stand-alone: Con la dirección spark://HOST:PORT.

Kubernetes: Con la dirección k8s://HOST:PORT.

Recursos del Controlador y del Ejecutor (Driver and Executor Resources)

 

Al enviar una aplicación, puedes especificar cuánta memoria y cuántos núcleos de CPU quieres asignar al controlador y a los ejecutores de Spark, utilizando opciones como --driver-memory, --executor-memory, entre otros.

 

Configuraciones de Spark-submit:

 

🐍Spark-submit soporta varias configuraciones utilizando --conf. Estas configuraciones se usan para especificar parámetros de la aplicación, parámetros de mezcla y configuraciones en tiempo de ejecución.

 

Envío de Trabajos en PySpark (Submitting Pyspark job):

 

🐍Cuando quieres hacer un spark-submit de una aplicación PySpark, necesitas especificar el archivo .py que quieres ejecutar y el archivo .egg o .zip para las bibliotecas de dependencia con --py-files.

 

Running Pyspark Script:









Trabajar con Apache Spark es un camino lleno de oportunidades y como todo buen desafío, requiere de astucia para superar algunos obstáculos:

 

✔️Cuando se Trata de Memoria...

A veces, Spark puede consumir más memoria de la cuenta, ralentizando el trabajo. Para evitarlo, es crucial ajustar la configuración de memoria y usar técnicas que limiten el movimiento de datos grandes por la red.

 

✔️Si las Consultas se Atraviesan...

Las consultas mal optimizadas pueden detener tu flujo de trabajo. Para darles velocidad, guarda datos que reutilizas y organiza tus datos de manera que Spark trabaje menos y más rápido.

 

✔️Y Sobre el Escalado...

¿Más datos? ¿Más usuarios? Eso no significa problemas si sabes cómo balancear la carga entre los recursos disponibles. Herramientas de monitoreo pueden ser tus mejores aliadas para mantener todo bajo control.

 

✔️Para Ser un Maestro en Escalado y Optimización...

Elige algoritmos que no consuman recursos innecesarios, utiliza las operaciones más eficientes y no pierdas de vista cómo Spark utiliza los recursos.

 

Recuerda, entender estos desafíos y saber cómo enfrentarlos te convertirá en un experto en el manejo de Spark. ¡Adelante con esos datos! 🚀




Conclusión:


Explora el potencial de Apache Spark y PySpark para revolucionar el análisis de datos. Este artículo es tu primer paso hacia el dominio de big data. ¡Atrévete a profundizar y transforma tu enfoque analítico!

112 visualizaciones0 comentarios
bottom of page