Novedades de Apache Spark 3.0

Apache Spark 3.0

Apache Spark celebra por todo lo alto su décimo aniversario con una nueva versión. Spark 3.0 incluye un gran número de cambios que mejoran su rendimiento y amplían sus capacidades en big data, sobretodo en la exploración y en el procesamiento de los datos.

El pasado 10 de Junio se publicó la última versión de Apache Spark, la versión 3.0. Ésta es una versión llena de cambios que tendrá un gran calado sobre todo en el área de la ciencia de datos. Y demuestra que, tras diez años, el proyecto open-source de computación distribuida Apache Spark sigue en plena forma. Los cambios e iniciativas de esta última versión muestran la capacidad del proyecto para abarcar cada vez más casos de uso y audiencias más amplias. Es esta evolución la que convierte a Spark en una de las herramientas más usadas en el sector del big data y data science.

+ 0
Mejoras
+ 0
Colaboradores

La versión 3.0 es el resultado de más de 3400 mejoras realizadas por la comunidad de código abierto. Entre los más de 440 colaboradores que han participado para hacerlo posible, podemos encontrar colaboradores individuales y compañías como Google, Microsoft, Intel, IBM, Facebook, Netflix y muchos más.

Entre las características más destacadas de Spark 3.0 encontramos:

  • Mejora del rendimiento de hasta 2 veces sobre Spark 2.4, gracias a la ejecución de consultas adaptativas, la poda de partición dinámica y otras optimizaciones.
  • Compatibilidad con ANSI SQL.
  • Mejoras significativas en la API de Pandas.
  • Mejora en el manejo de los errores de Python, simplificando las excepciones de PySpark.
  • Nueva interfaz de usuario para Spark Structured Streaming.
  • Aumento de hasta 40 veces la velocidad en las llamadas a UDFs de R.

Mejora del motor Spark SQL

El componente que más cambios ha recibido es Spark SQL, con un 46% de las mejoras. Aunque el resto de librerías de alto nivel de Spark también han sufrido mejoras. Todas estas optimizaciones han logrado que Spark 3.0 sea hasta dos veces más rápido que la versión anterior, Spark 2.4.

El nuevo framework de ejecución adaptativa de consultas (Adaptative Query Execution, AQE) mejora el rendimiento y simplifica el ajuste (tuning) generando un mejor plan de ejecución durante el tiempo de ejecución. Debido a la separación del almacenamiento y el procesamiento en Spark, la llegada de datos no es predecible. Por estas razones, la adaptabilidad en tiempo de ejecución es más crítica para Spark que para sistemas tradicionales. Esta versión introduce tres grandes optimizaciones en la adaptabilidad:
  • Fusionar particiones dinámicamente (Dynamically coalescing shuffle partitions), lo que simplifica o incluso evita el ajuste del número de particiones.
  • Cambiar dinámicamente estrategias de unión (Dynamically switching join strategies). Esta optimización evita planes de ejecución subóptimos, lo que simplifica el tuneo y mejora el rendimiento.
  • Optimización dinámica de combinaciones sesgadas (Dynamically optimizing skew joins). Las combinaciones sesgadas pueden desbalancear las cargas de trabajo y afectar gravemente al rendimiento, por lo que con esta optimización AQE consigue una mejora general del rendimiento paralelizando estos procesos.
La poda de particiones dinámica (Dynamic Partition Pruning) se aplica cuando el optimizador no es capaz de identificar en tiempo de compilación las particiones que puede omitir. LLegando a reducir significativamente la carga de trabajo de los procesos. La compatibilidad de ANSI SQL es crítica en la migración de cargas de trabajo de otros motores SQL a Spark SQL. Por lo que para mejorar la compatibilidad, en esta versión se ha cambiado al calendario gregoriano proléptico y también permite a los usuarios prohibir el uso de palabras clave reservadas de ANSI SQL como identificadores. Además, se ha introducido la verificación de desbordamiento en tiempo de ejecución en operaciones numéricas y la aplicación del tipo en tiempo de compilación al insertar datos en una tabla con un esquema predefinido. Estas nuevas validaciones mejoran la calidad del dato.

Mejora de las APIs de Python

La mejora del soporte y la usabilidad de Python en Spark continúa siendo una de las mayores prioridades. De hecho, Python ya es el lenguaje de programación más usado en Spark, superando a Scala. Esto muestra la importancia que se le ha dado en esta versión a la exploración y tratamiento de los datos.

Esta versión mejora las funcionalidad y usabilidad en Python, incluyendo un rediseño de la API de Pandas UDF. A partir de esta versión el uso de las funciones Pandas UDF se hace más sencillo y autodescriptivo, incluyendo dos nuevas funciones: map y co-grouped map. Además se ha mejorado el tratamiento de los errores, haciéndolos más comprensible para los usuarios de PySpark.

 

Del mismo modo que se han añadido unas funcionalidades, también se han suprimido otras. Con la llegada de Spark 3.0 se ha eliminado el soporte a Python 2 y versiones anteriores de R 3.4, y el método UserDefinedAggregateFunction.

Mejoras en Spark Structured Streaming

Esta nueva versión de Apache Spark incluye una nueva interfaz de usuario dedicada para los trabajos en tiempo real. Esta nueva UI muestra dos conjuntos de estadísticas:

  1. Información agregada de consultas en streaming completadas.
  2. Información estadística detallada sobre las consultas en streaming.

En esta versión se introduce la monitorización tanto para aplicaciones batch como aplicaciones streaming.

En este post hemos querido analizar los cambios que consideramos más relevantes, pero la versión 3.0 de Spark trae muchas otras novedades importantes de las que no hemos hablado. Revisa las notas de la versión donde podrás encontrar todas las mejoras, las desestimaciones (deprecations), las guías de migración y programación para cada componente y los temas a resolver en futuras versiones.

Novedades en Apache Spark 3.0

Descarga la nueva versión de Apache Spark

Para descargar esta nueva versión de Spark, visita esta página. La adaptación de las aplicaciones de Apache Spark a esta nueva versión no requiere cambios significativos de código. Para más información consulta la guía de migración.

Arquitectura de Spark

arquitectura de apache spark

La arquitectura de Spark cuenta con un diseño modular que le permite adoptar diferentes configuraciones según la necesidad. Además de la flexibilidad que le aporta a Spark su diseño de programación, el modelo de computación maestro-esclavo le aporta escalabilidad y tolerancia a fallos, convirtiéndole en un todoterreno del Big Data.

Apache Spark es una de las herramientas más utilizadas en Big Data. En este artículo vamos a abordar la arquitectura de Spark tanto a nivel de software, como a nivel de hardware. Cada uno de estos enfoques le aporta a la herramienta características diferentes, que unidas definen el potencial de la herramienta.

Primero hablaremos de la parte software y su modelo de programación, que nos va a permitir entender la lógica del sistema. Y después hablaremos sobre su parte más física, su modelo de computación.

Arquitectura de Spark: el motor del Big Data

El motor de Spark lo conforman un conjunto de piezas, que unidas, le aportan las propiedades básicas. Estas piezas básicas que definen su funcionamiento, las podemos organizar en capas que se sustentan unas sobre otras, como si fuese una tarta.

Aunque la estructura de Spark es rígida y siempre debemos tener estas piezas básicas como pilares,  su diseño modular nos permite trabajar con ellas de manera independiente, lo que nos va a dar una gran flexibilidad a la hora de desarrollar nuestros proyectos.

Administrador de tareas

Administrador de recursos del clúster

Sistema de almacenamiento distribuido

¡Sin una de estas piezas ningún programa de Spark puede funcionar! A continuación, vamos a explicar cada uno de los pilares sobre los que se cimienta esta tecnología.

Sistema de almacenamiento distribuido

Spark no cuenta con una capa de almacenamiento, por lo que necesitamos un sistema de almacenamiento sobre el que apoyar la plataforma, además este deberá ser distribuido. Tendremos que usar algún sistema de almacenamiento externo para la gestión de los datos, como pueden ser el sistema de archivos distribuido HDFS, o los sistemas de bases de datos distribuidas HBase, MongoDB o Cassandra.

Esto nos aporta flexibilidad a la hora de procesar los datos, ya que al poder usar diferentes orígenes de datos, podremos elegir el que mejor se adapte a nuestro proceso.

Administrador de recursos del clúster

Sobre la capa de almacenamiento, se encuentra la capa de procesamiento. El administrador de recursos es la pieza dentro del motor de Spark que aporta a la plataforma la capacidad de gestionar los recursos disponibles en el clúster de manera autónoma.

Por defecto Spark cuenta con Spark Standalone Scheduler, un gestor de nodos muy básico. Así que generalmente nos apoyaremos sobre un administrador más potente como Mesos o YARN.

Administrador de tareas

Finalmente, sobre el sistema de almacenamiento que nos permite leer y escribir la información, y sobre el administrador de recursos que nos permite gestionar el procesamiento distribuido de los datos; situamos la pieza que gestiona las tareas a ejecutar.

Esta pieza es la base en la que se apoyarán el resto de módulos, es el núcleo del framework. Conocida como Spark Core, realmente es la pieza sobre la que trabajan todas las aplicaciones y es la que conocemos como Spark.

Extensiones: aumentando las funcionalidades de Spark

Estas capas de almacenamientos, procesamiento y planificación, sirven como base en la que desplegar diferentes complementos que aportan nuevas funcionalidades al sistema. Los propios desarrolladores de Spark han trabajado en varias librerías que extienden el alcance de esta herramienta, aunque también otros equipos trabajan desarrollando complementos sobre Spark.

Los módulos que podemos encontrar dentro del proyecto de Spark son:

  • Spark SQL: esta librería está diseñada para el tratamiento y consulta de datos estructurados y semi-estructurados. Con este módulo vamos a poder crear, transformar y realizar operaciones sobre estas estructuras de datos.
  • Spark ML y MLlib: estas librerías nos permiten realizar aprendizaje automático (machine learning) de manera escalable.
  • Spark Streaming: esta librería nos permite construir aplicaciones escalables y tolerantes a fallos para el tratamiento de datos en tiempo real (micro-batching). Con este módulo podemos recibir datos de una fuente en tiempo real, transformarlos y dejarlos en un destino.
  • Spark GraphX: esta librería nos permite el cómputo de grafos sobre Spark. Este módulo está disponible para menos lenguajes de programación que los anteriores, únicamente para Scala y Java.

Estas librerías comunes aumentan la productividad de los usuarios y pueden combinarse para crear flujos de trabajo complejos, creando así un motor unificado de procesamiento de datos a gran escala.

Spark SQL

Spark ML

Spark Streaming

Spark GraphX

Spark

Arquitectura maestro-esclavo

Acabamos de ver cómo se organiza el modelo de programación de Spark, pero ¿qué pasa con su modelo de computación? Spark es un framework de computación distribuida, lo que significa que vamos a tener varias máquinas interconectadas operando como una sola. Estas máquinas para organizarse necesitan una red por la que enviarse mensajes y establecer relaciones bien definidas entre ellas para realizar el trabajo. En este caso, tenemos un modelo maestro-esclavo en el que contamos con una organización jerárquica en la que una máquina, que denominaremos maestro, coordina el trabajo de otras, que llamaremos esclavos o trabajadores.

Escalabilidad

El modelo maestro-esclavo permite quitar o añadir máquinas a la red en cualquier momento sin tener que reiniciar el sistema. Esto permite que Spark pueda escalar aumentando o disminuyendo los recursos durante la ejecución de un proceso, según sea necesario.

Tolerancia a Fallos

Además, si uno de los nodos trabajadores de la red falla, su trabajo es asignado al resto de nodos trabajadores mientras el nodo afectado se recupera.

Disponibilidad

Sin embargo, el modelo de arquitectura maestro-esclavo tiene un punto débil en el nodo máster. Y es que este es crítico, si este nodo falla se pierde el punto de contacto de todas las conexiones del sistema y la ejecución del proceso fracasa. Para solucionar esto, existen otras herramientas como Apache Zookeeper que se encarga de reemplazar el nodo maestro por otro en caso de fallo para que el proceso pueda continuar hasta su finalización.

Como hemos visto, cuando hablamos de la arquitectura de Spark podemos hablar sobre la arquitectura software y su diseño modular, o sobre su arquitectura computacional basada en un modelo distribuido. Su diseño modular le aporta flexibilidad y le permite incorporar nuevas funcionalidades que le hacen más completo aún. Mientras que la arquitectura distribuida, le brinda la escalabilidad y la tolerancia a fallos por las que destaca entre los proyectos de Big Data.

Qué es Apache Spark

introducción a apache spark

Spark es un framework de computación distribuida diseñado para el procesamiento de grandes volúmenes de datos que permite dividir y paralelizar el trabajo. En esta introducción a Apache Spark vamos a explicar qué es, para qué sirve, cuándo debes usarlo y por qué debes usarlo.

Apache Spark es una herramienta software diseñada para tratar problemas computacionales de forma distribuida. Pero antes de explicar para qué sirve Spark, vamos a asegurarnos de que sabemos lo que es un framework o la computación distribuida. 

Un framework es un concepto abstracto que se define como un conjunto estandarizado de definiciones, prácticas, criterios y herramientas creado para abordar una problemática concreta. Se materializa en un software que ofrece un entorno de trabajo que sirve de referencia para los usuarios, lo que simplifica las tareas a la hora de resolver un problema.

Generalmente, cuando trabajamos desde nuestro ordenador  las tareas las realiza la propia máquina. En cambio, la computación distribuida nos permite asociar diferentes máquinas para que colaboren y se distribuyan las tareas entre ellas. Las tareas se dividen en subtareas más ligeras que son asignadas a las diferentes máquinas, reduciendo así la carga de trabajo de cada una de ellas y aumentando la capacidad total del grupo.

Spark permite el tratamiento, la consulta, el machine learning y el streaming sobre cantidades de datos, cantidades que antes de la aparición del Big Data eran impensables. Spark se caracteriza por su velocidad, facilidad de uso y generalidad. Además, su modelo de arquitectura le proporciona escalabilidad horizontal y tolerancia a fallos, por lo que Spark se ha convertido en una pieza clave para el Big Data.

¿Por qué usar Spark?

Spark es una herramienta que se ha ganado una gran reputación en el mundo del Big Data, tanto entre las empresas como entre los desarrolladores e investigadores. Esto es debido principalmente a su gran rendimiento y a que se trata de una herramienta de código abierto (licencia Apache), lo que se traduce en soporte por parte de la comunidad. Es realmente sencillo encontrar documentación y ayuda sobre la herramienta en la web, lo que democratiza aún más su uso. 

Origen de Spark

Apache Spark es la evolución de Apache Hadoop, una de las primeras herramientas Big Data. Spark fue desarrollado para evitar las limitaciones que planteaba el paradigma MapReduce en Hadoop.

Los procesos de Hadoop son muy lentos, el resultado de cada paso del proceso se escribe en disco para que el siguiente paso lo lea. Ante este hándicap, se plantea una solución más ágil. Spark almacena los datos en memoria en lugar de en disco como Hadoop, lo que hace que las ejecuciones sean más rápidas. Esta solución, junto con otras optimizaciones, permite a Spark procesar datos hasta 100 veces más rápido si lo comparamos con Hadoop.

La lectura y escritura en disco son de los procesos más lentos para un ordenador.​

Comparativa en tiempos de ejecución de una regresión logística para el mismo conjunto de datos

En ocasiones, cuando el volumen de los datos es demasiado grande como para almacenarlo en memoria, es necesario que Spark almacene los datos en disco. En estas situaciones, Spark tambíen es rápido cuando almacena datos a gran escala en disco. Esto hace que tengamos que encontrar el equilibrio entre lo que se almacena en memoria y lo que se almacena en disco, para tener una buena velocidad y para que el coste no sea demasiado elevado, ya que la memoria siempre es bastante más cara que el disco.

Aunque en los últimos años a Spark le han salido un gran número de competidores, sigue siendo el buque insignia del procesamiento en Big Data. En ciertos problemas concretos, como el procesamiento en tiempo real, Spark sale perdiendo ya que trabaja por lotes, y existen alternativas más adecuadas como Apache Flink que realmente opera en tiempo real. Pero la generalidad de Spark, su capacidad a adaptarse a casi cualquier tipo de terreno y su evolución constante por parte de la comunidad, le mantienen entre las soluciones más usadas.