Capítulo 1. ¿Qué es Apache Spark? ¿Qué es Apache Spark?
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Apache Spark es un motor informático unificado y un conjunto de bibliotecas para el procesamiento paralelo de datos en clusters informáticos. En el momento de escribir estas líneas, Spark es el motor de código abierto más activamente desarrollado para esta tarea, lo que lo convierte en una herramienta estándar para cualquier desarrollador o científico de datos interesado en los big data. Spark es compatible con varios lenguajes de programación ampliamente utilizados (Python, Java, Scala y R), incluye bibliotecas para diversas tareas que van desde SQL hasta streaming y aprendizaje automático, y se ejecuta en cualquier lugar, desde un ordenador portátil hasta un clúster de miles de servidores. Esto lo convierte en un sistema con el que es fácil empezar y escalar al procesamiento de grandes datos o a una escala increíblemente grande.
La Figura 1-1 ilustra todos los componentes y bibliotecas que Spark ofrece a los usuarios finales.
Verás que las categorías se corresponden aproximadamente con las distintas partes de este libro. En realidad, no debería sorprenderte; nuestro objetivo aquí es formarte en todos los aspectos de Spark, y Spark se compone de varios componentes diferentes.
Dado que estás leyendo este libro, es posible que ya conozcas un poco Apache Spark y lo que puede hacer. No obstante, en este capítulo, queremos cubrir brevemente la filosofía fundamental que hay detrás de Spark, así como el contexto en el que se desarrolló (¿por qué de repente todo el mundo está entusiasmado con el procesamiento paralelo de datos?) y su historia. También esbozaremos los primeros pasos para ejecutar Spark.
Filosofía de Apache Spark
Desglosemos en nuestra descripción de Apache Spark -un motor informático unificado y un conjunto de bibliotecas para big data- en sus componentes clave:
- Unificado
-
El objetivo clave de Spark es ofrecer una plataforma unificada para escribir aplicaciones de big data. ¿Qué queremos decir con unificada? Spark está diseñado para soportar una amplia gama de tareas de análisis de datos, que van desde la simple carga de datos y las consultas SQL hasta el aprendizaje automático y la computación en flujo, sobre el mismo motor de computación y con un conjunto coherente de API. La idea principal que subyace a este objetivo es que las tareas de análisis de datos del mundo real -ya sean análisis interactivos en una herramienta como un cuaderno Jupyter, o desarrollo de software tradicional para aplicaciones de producción- tienden a combinar muchos tipos de procesamiento y bibliotecas diferentes.
La naturaleza unificada de Spark hace que estas tareas sean más fáciles y eficientes de escribir. En primer lugar, Spark proporciona API consistentes y componibles que puedes utilizar para construir una aplicación a partir de piezas más pequeñas o de bibliotecas existentes. También te facilita escribir tus propias bibliotecas analíticas sobre ellas. Sin embargo, las API componibles no son suficientes: Las API de Spark también están diseñadas para permitir un alto rendimiento mediante la optimización de las distintas bibliotecas y funciones compuestas conjuntamente en un programa de usuario. Por ejemplo, si cargas datos mediante una consulta SQL y luego evalúas un modelo de aprendizaje automático sobre ellos utilizando la biblioteca ML de Spark, el motor puede combinar estos pasos en un solo análisis sobre los datos. La combinación de API generales y ejecución de alto rendimiento, independientemente de cómo las combines, hace de Spark una potente plataforma para aplicaciones interactivas y de producción.
El enfoque de Spark en la definición de una plataforma unificada es la misma idea que subyace a las plataformas unificadas en otras áreas del software. Por ejemplo, los científicos de datos se benefician de un conjunto unificado de bibliotecas (por ejemplo, Python o R) cuando hacen modelado, y los desarrolladores web se benefician de marcos unificados como Node.js o Django. Antes de Spark, ningún sistema de código abierto intentaba proporcionar este tipo de motor unificado para el procesamiento paralelo de datos, lo que significaba que los usuarios tenían que coser una aplicación a partir de múltiples API y sistemas. Así, Spark se convirtió rápidamente en el estándar para este tipo de desarrollo. Con el tiempo, Spark ha seguido ampliando sus API integradas para cubrir más cargas de trabajo. Al mismo tiempo, los desarrolladores del proyecto han seguido perfeccionando su tema de motor unificado. En particular, uno de los principales temas de este libro serán las "API estructuradas" (DataFrames, Datasets y SQL) que se finalizaron en Spark 2.0 para permitir una optimización más potente en las aplicaciones de usuario.
- Motor informático
-
En al mismo tiempo que Spark se esfuerza por la unificación, limita cuidadosamente su alcance a un motor de cálculo. Con esto queremos decir que Spark se encarga de cargar los datos de los sistemas de almacenamiento y realizar cálculos sobre ellos, no del almacenamiento permanente como fin en sí mismo. Puedes utilizar Spark con una amplia variedad de sistemas de almacenamiento persistente, incluidos sistemas de almacenamiento en la nube como Azure Storage y Amazon S3, sistemas de archivos distribuidos como Apache Hadoop, almacenes de valores clave como Apache Cassandra y buses de mensajes como Apache Kafka. Sin embargo, Spark ni almacena los datos a largo plazo por sí mismo, ni favorece a unos sobre otros. La motivación clave aquí es que la mayoría de los datos ya residen en una mezcla de sistemas de almacenamiento. Los datos son caros de mover, por lo que Spark se centra en realizar cálculos sobre los datos, independientemente de dónde residan. En las API orientadas al usuario, Spark se esfuerza por hacer que estos sistemas de almacenamiento se parezcan en gran medida, para que las aplicaciones no tengan que preocuparse de dónde están sus datos.
El enfoque de Spark en la computación lo diferencia de las anteriores plataformas de software de big data, como Apache Hadoop. Hadoop incluía un sistema de almacenamiento (el sistema de archivos Hadoop, diseñado para el almacenamiento de bajo coste en clusters de servidores básicos) y un sistema de computación (MapReduce), que estaban estrechamente integrados. Sin embargo, esta elección dificulta el funcionamiento de uno de los sistemas sin el otro. Y lo que es más importante, esta elección también dificulta la escritura de aplicaciones que accedan a datos almacenados en cualquier otro lugar. Aunque Spark funciona bien en el almacenamiento de Hadoop, hoy en día también se utiliza ampliamente en entornos para los que la arquitectura Hadoop no tiene sentido, como la nube pública (donde el almacenamiento se puede comprar por separado de la computación) o las aplicaciones de streaming.
- Bibliotecas
-
El componente final de Spark son sus bibliotecas, que se basan en su diseño como motor unificado para proporcionar una API unificada para tareas comunes de análisis de datos. Spark es compatible tanto con las bibliotecas estándar que vienen con el motor como con una amplia gama de bibliotecas externas publicadas como paquetes de terceros por las comunidades de código abierto. Hoy en día, las bibliotecas estándar de Spark son en realidad el grueso del proyecto de código abierto: el motor central de Spark en sí ha cambiado poco desde que se lanzó por primera vez, pero las bibliotecas han crecido para proporcionar cada vez más tipos de funcionalidad. Spark incluye bibliotecas para SQL y datos estructurados (Spark SQL), aprendizaje automático (MLlib), procesamiento de flujos (Spark Streaming y la más reciente Structured Streaming) y análisis de gráficos (GraphX). Además de estas bibliotecas, hay cientos de bibliotecas externas de código abierto que van desde conectores para diversos sistemas de almacenamiento hasta algoritmos de aprendizaje automático. Puedes consultar un índice de bibliotecas externas en en spark-packages.org.
El Contexto: El problema de los grandes datos
Para empezar, ¿por qué necesitamos un nuevo motor y modelo de programación para el análisis de datos? Como ocurre con muchas tendencias en informática, se debe a los cambios en los factores económicos que subyacen a las aplicaciones informáticas y al hardware.
Durante la mayor parte de su historia, los ordenadores se hicieron más rápidos cada año gracias al aumento de la velocidad de los procesadores: los nuevos procesadores cada año podían ejecutar más instrucciones por segundo que los del año anterior. Como resultado, las aplicaciones también se hicieron más rápidas automáticamente cada año, sin necesidad de realizar ningún cambio en su código. Esta tendencia hizo que, con el tiempo, se creara un amplio y consolidado ecosistema de aplicaciones, la mayoría de las cuales estaban diseñadas para ejecutarse sólo en un único procesador. Estas aplicaciones aprovecharon la tendencia de la mejora de la velocidad de los procesadores para escalar a cálculos más grandes y mayores volúmenes de datos con el tiempo.
Desgraciadamente, esta tendencia en el hardware se detuvo alrededor de 2005: debido a los duros límites en la disipación del calor, los desarrolladores de hardware dejaron de hacer procesadores individuales más rápidos, y pasaron a añadir más núcleos de CPU paralelos funcionando todos a la misma velocidad. Este cambio significó que, de repente, las aplicaciones tuvieron que modificarse para añadir paralelismo con el fin de ejecutarse más rápido, lo que sentó las bases para nuevos modelos de programación como Apache Spark.
Además, las tecnologías de almacenamiento y recopilación de datos no se ralentizaron sensiblemente en 2005, cuando sí lo hicieron las velocidades de los procesadores. El coste de almacenar 1 TB de datos sigue bajando aproximadamente dos veces cada 14 meses, lo que significa que es muy barato para las organizaciones de todos los tamaños almacenar grandes cantidades de datos. Además, muchas de las tecnologías de recogida de datos (sensores, cámaras, conjuntos de datos públicos, etc.) siguen bajando de coste y mejorando su resolución. Por ejemplo, la tecnología de las cámaras sigue mejorando en resolución y bajando en coste por píxel cada año, hasta el punto de que una webcam de 12 megapíxeles sólo cuesta entre 3 y 4 dólares; esto ha hecho que sea barato recoger una amplia gama de datos visuales, ya sea de personas que graban vídeo o de sensores automatizados en un entorno industrial. Además, las cámaras son a su vez los sensores clave de otros dispositivos de recogida de datos, como telescopios e incluso máquinas de secuenciación genética, lo que también ha abaratado el coste de estas tecnologías.
El resultado final es un mundo en el que recopilar datos es extremadamente barato -muchas organizaciones actuales incluso consideran negligente no registrar datos de posible relevancia para el negocio-, pero procesarlos requiere grandes cálculos paralelos, a menudo en clusters de máquinas. Además, en este nuevo mundo, el software desarrollado en los últimos 50 años no puede ampliarse automáticamente, ni tampoco los modelos de programación tradicionales para las aplicaciones de procesamiento de datos, lo que crea la necesidad de nuevos modelos de programación. Es para este mundo para el que se construyó Apache Spark.
Historia de Spark
Apache Spark comenzó en la UC Berkeley en 2009 como el proyecto de investigación Spark, que se publicó por primera vez al año siguiente en un documento titulado "Spark: Cluster Computing with Working Sets" de Matei Zaharia, Mosharaf Chowdhury, Michael Franklin, Scott Shenker e Ion Stoica del AMPlab de la UC Berkeley. En aquel momento, Hadoop MapReduce era el motor de programación paralela dominante para clústeres, siendo el primer sistema de código abierto que abordaba el procesamiento paralelo de datos en clústeres de miles de nodos. El AMPlab había trabajado con varios de los primeros usuarios de MapReduce para comprender las ventajas y los inconvenientes de este nuevo modelo de programación, por lo que pudo sintetizar una lista de problemas en varios casos de uso y empezar a diseñar plataformas informáticas más generales. Además, Zaharia también había trabajado con usuarios de Hadoop en la UC Berkeley para comprender sus necesidades para la plataforma, en concreto, equipos que realizaban aprendizaje automático a gran escala utilizando algoritmos iterativos que necesitan realizar múltiples pasadas sobre los datos.
En estas conversaciones, dos cosas estaban claras. En primer lugar, la computación en clúster tenía un enorme potencial: en todas las organizaciones que utilizaban MapReduce, se podían crear aplicaciones totalmente nuevas utilizando los datos existentes, y muchos grupos nuevos empezaron a utilizar el sistema después de sus casos de uso iniciales. En segundo lugar, sin embargo, el motor de MapReduce hacía que la creación de grandes aplicaciones fuera a la vez difícil e ineficaz. Por ejemplo, el típico algoritmo de aprendizaje automático podría necesitar hacer 10 ó 20 pasadas sobre los datos, y en MapReduce, cada pasada tenía que escribirse como un trabajo MapReduce independiente, que tenía que lanzarse por separado en el clúster y cargar los datos desde cero.
Para abordar este problema, el equipo de Spark diseñó primero una API basada en la programación funcional que pudiera expresar sucintamente las aplicaciones multipaso. A continuación, el equipo implementó esta API en un nuevo motor que podía compartir datos en memoria de forma eficiente entre los pasos de cálculo. El equipo también empezó a probar este sistema tanto con Berkeley como con usuarios externos.
La primera versión de Spark en sólo admitía aplicaciones por lotes, pero pronto se hizo evidente otro caso de uso convincente: la ciencia de datos interactiva y las consultas ad hoc. Con sólo conectar el intérprete Scala a Spark, el proyecto podía proporcionar un sistema interactivo muy útil para ejecutar consultas en cientos de máquinas. El AMPlab también se basó rápidamente en esta idea para desarrollar Shark, un motor que podía ejecutar consultas SQL en Spark y permitir el uso interactivo por parte de analistas y científicos de datos. Shark se lanzó por primera vez en 2011.
Tras estos lanzamientos iniciales, pronto quedó claro que las adiciones más potentes a Spark serían nuevas bibliotecas, por lo que el proyecto empezó a seguir el enfoque de "biblioteca estándar" que tiene en la actualidad. En concreto, distintos grupos de AMPlab pusieron en marcha MLlib, Spark Streaming y GraphX. También se aseguraron de que estas API fueran altamente interoperables, permitiendo por primera vez escribir aplicaciones de big data de extremo a extremo en el mismo motor.
En 2013, el proyecto había crecido hasta alcanzar un uso generalizado, con más de 100 colaboradores de más de 30 organizaciones ajenas a la UC Berkeley. El AMPlab aportó Spark a la Fundación del Software Apache como hogar a largo plazo e independiente del proveedor para el proyecto. El equipo inicial de AMPlab también lanzó una empresa, Databricks, para reforzar el proyecto, uniéndose a la comunidad de otras empresas y organizaciones que contribuyen a Spark. Desde entonces, la comunidad de Apache Spark publicó Spark 1.0 en 2014 y Spark 2.0 en 2016, y sigue realizando publicaciones periódicas, aportando nuevas funciones al proyecto.
Por último, La idea central de Spark de las API componibles también se ha ido perfeccionando con el tiempo. Las primeras versiones de Spark (anteriores a la 1.0) definían en gran medida esta API en términos de operaciones funcionales:operaciones paralelascomo mapas y reducciones sobre colecciones de objetos Java. A partir de la versión 1.0, el proyecto añadió Spark SQL, una nueva API para trabajar con datos estructurados: tablascon un formato de datos fijo que no está vinculado a la representación en memoria de Java. Spark SQL permitió nuevas y potentes optimizaciones entre bibliotecas y API al comprender con más detalle tanto el formato de los datos como el código de usuario que se ejecuta sobre ellos. Con el tiempo, el proyecto añadió una plétora de nuevas API que se basan en esta base estructurada más potente, incluyendo DataFrames, pipelines de aprendizaje automático y Structured Streaming, una API de streaming de alto nivel optimizada automáticamente. En este libro, dedicaremos una cantidad significativa de tiempo a explicar estas API de nueva generación, la mayoría de las cuales están marcadas como listas para la producción.
Presente y futuro de Spark
Spark existe desde hace varios años, pero sigue ganando en popularidad y casos de uso. Muchos proyectos nuevos dentro del ecosistema Spark siguen ampliando los límites de lo que es posible con el sistema. Por ejemplo, en 2016 se introdujo un nuevo motor de streaming de alto nivel, el Streaming Estructurado. Esta tecnología es una parte importante de las empresas que resuelven retos de datos a gran escala, desde empresas tecnológicas como Uber y Netflix que utilizan las herramientas de streaming y aprendizaje automático de Spark, hasta instituciones como la NASA, el CERN y el Instituto Broad del MIT y Harvard que aplican Spark al análisis de datos científicos.
Spark seguirá siendo la piedra angular de las empresas que realizan análisis de big data en un futuro previsible, sobre todo teniendo en cuenta que el proyecto sigue desarrollándose rápidamente. Cualquier científico o ingeniero de datos que necesite resolver problemas de big data probablemente necesite una copia de Spark en su máquina y, con suerte, ¡una copia de este libro en su estantería!
Correr Chispa
Este libro de contiene abundante código relacionado con Spark, y es esencial que estés preparado para ejecutarlo mientras aprendes. En su mayor parte, querrás ejecutar el código de forma interactiva para poder experimentar con él. Repasemos algunas de tus opciones antes de empezar a trabajar con las partes de codificación del libro.
Puedes utilizar Spark desde Python, Java, Scala, R o SQL. Spark en sí está escrito en Scala, y se ejecuta en la Máquina Virtual Java (JVM), por lo que para ejecutar Spark en tu portátil o en un clúster, todo lo que necesitas es una instalación de Java. Si quieres utilizar la API de Python, también necesitarás un intérprete de Python (versión 2.7 o posterior). Si quieres utilizar R, necesitarás una versión de R en tu máquina.
Hay dos opciones que recomendamos para empezar con Spark: descargar e instalar Apache Spark en tu portátil, o ejecutar una versión basada en web en Databricks Community Edition, un entorno gratuito en la nube para aprender Spark que incluye el código de este libro. A continuación explicamos ambas opciones.
Descarga local de Spark
Si quieres descargar y ejecutar Spark localmente, el primer paso es asegurarte de que tienes Java instalado en tu máquina (disponible en java
), así como una versión de Python si quieres utilizar Python. A continuación, visita la página oficial de descargas del proyecto, selecciona el tipo de paquete "Pre-construido para Hadoop 2.7 y posteriores" y haz clic en "Descarga directa". Esto descarga un archivo TAR comprimido, o tarball, que tendrás que extraer. La mayor parte de este libro se escribió utilizando Spark 2.2, por lo que descargar la versión 2.2 o posterior debería ser un buen punto de partida.
Descargar Spark para un clúster Hadoop
Spark puede ejecutarse localmente sin ningún sistema de almacenamiento distribuido, como Apache Hadoop. Sin embargo, si quieres conectar la versión de Spark de tu portátil a un clúster de Hadoop, asegúrate de descargar la versión de Spark adecuada para esa versión de Hadoop, que puedes elegir en http://spark.apache.org/downloads.html seleccionando un tipo de paquete diferente. En capítulos posteriores hablaremos de cómo se ejecuta Spark en clusters y en el sistema de archivos de Hadoop, pero en este momento te recomendamos que, para empezar, sólo ejecutes Spark en tu portátil.
Construir Spark desde el código fuente
Nosotros no cubriremos esto en el libro, pero también puedes construir y configurar Spark desde el código fuente. Puedes seleccionar un paquete fuente en la página de descargas de Apache para obtener sólo el código fuente y seguir las instrucciones del archivo README para construirlo.
Cuando hayas descargado Spark, deberás abrir una línea de comandos y extraer el paquete. En nuestro caso, vamos a instalar Spark 2.2. El siguiente es un fragmento de código que puedes ejecutar en cualquier línea de comandos tipo Unix para descomprimir el archivo que has descargado de Spark y moverlo al directorio:
cd
~/
Downloads
tar
-
xf
spark
-
2.2
.
0
-
bin
-
hadoop2
.
7.
tgz
cd
spark
-
2.2
.
0
-
bin
-
hadoop2
.
7.
tgz
Ten en cuenta que Spark tiene un gran número de directorios y archivos dentro del proyecto. ¡No te sientas intimidado! La mayoría de estos directorios sólo son relevantes si estás leyendo el código fuente. La siguiente sección cubrirá los directorios más importantes: los que nos permiten lanzar las diferentes consolas de Spark para su uso interactivo.
Lanzamiento de las Consolas Interactivas Spark
Tú puedes iniciar un shell interactivo en Spark para varios lenguajes de programación diferentes. La mayor parte de este libro está escrito teniendo en cuenta Python, Scala y SQL; por lo tanto, esos son nuestros puntos de partida recomendados.
Iniciar la consola de Python
En necesitarás tener instalado Python 2 ó 3 para poder ejecutar la consola Python. Desde el directorio inicial de Spark, ejecuta el siguiente código:
./bin/pyspark
Una vez hecho esto, escribe "spark" y pulsa Intro. Verás impreso el objeto SparkSession, del que hablamos en el Capítulo 2.
Iniciar la consola Scala
Para lanzar la consola de Scala, tendrás que ejecutar el siguiente comando:
./bin/spark-shell
Una vez hecho esto, escribe "spark" y pulsa Intro. Como en Python, verás el objeto SparkSession, que veremos en el Capítulo 2.
Ejecutar Spark en la nube
Si te gustaría tener una experiencia de cuaderno sencilla e interactiva para aprender Spark, quizá prefieras utilizar Databricks Community Edition. Databricks, como hemos mencionado antes, es una empresa fundada por el equipo de Berkeley que puso en marcha Spark, y ofrece una edición comunitaria gratuita de su servicio en la nube como entorno de aprendizaje. La Edición Comunitaria de Databricks incluye una copia de todos los datos y ejemplos de código de este libro, lo que facilita la ejecución rápida de cualquiera de ellos. Para utilizar la Edición Comunitaria de Databricks, sigue las instrucciones en https://github.com/databricks/Spark-The-Definitive-Guide. Podrás utilizar Scala, Python, SQL o R desde una interfaz basada en un navegador web para ejecutar y visualizar los resultados.
Datos utilizados en este libro
En este libro utilizaremos varias fuentes de datos para nuestros ejemplos. Si quieres ejecutar el código localmente, puedes descargarlos del repositorio oficial de código de este libro, tal y como se describe en https://github.com/databricks/Spark-The-Definitive-Guide. En resumen, ¡descargarás los datos, los pondrás en una carpeta y luego ejecutarás los fragmentos de código de este libro!
Get Spark: La Guía Definitiva now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.