¿Qué es Spark? La gran plataforma de datos que aplastó a Hadoop

Spark apache definida

Apache Spark es un marco de procesamiento de datos que puede realizar rápidamente tareas de procesamiento en conjuntos de datos muy grandes, y también puede distribuir las tareas de procesamiento de datos entre múltiples computadoras, ya sea por sí solo o en conjunto con otras herramientas informáticas distribuidas. Estas dos cualidades son clave para los mundos de los grandes datos y del aprendizaje automático, que requieren la obtención de una enorme potencia de computación para atravesar los grandes almacenes de datos. Spark también quita algunas de las cargas de programación de estas tareas de los hombros de los desarrolladores con una API fácil de usar que abstrae gran parte del trabajo pesado de la computación distribuida y el procesamiento de grandes datos.

Desde sus humildes comienzos en el AMPLab de la U.C. Berkeley en 2009, Apache Spark se ha convertido en uno de los grandes marcos de procesamiento de datos distribuidos más importantes del mundo. Spark puede ser desplegado de varias maneras, provee enlaces nativos para los lenguajes de programación Java, Scala, Python, y R, y soporta SQL, datos en tiempo real, aprendizaje automático, y procesamiento de gráficos. Lo encontrarán usado por bancos, compañías de telecomunicaciones, compañías de juegos, gobiernos, y todos los grandes gigantes de la tecnología como Apple, Facebook, IBM, y Microsoft.

La arquitectura de Spark Apache

En un nivel fundamental, una aplicación Apache Spark consta de dos componentes principales: una conductor, que convierte el código del usuario en múltiples tareas que pueden ser distribuidas a través de los nodos del trabajador, y ejecutores, que se ejecutan en esos nodos y ejecutan las tareas que se les asignan. Es necesario algún tipo de gestor de clústeres para mediar entre ambos.

Fuera de la caja, Spark puede funcionar en un modo de clúster autónomo que simplemente requiere el marco de Apache Spark y una JVM en cada máquina de su clúster. Sin embargo, es más probable que quieras aprovechar un recurso más robusto o un sistema de gestión de clústeres para encargarte de asignar trabajadores a petición tuya. En la empresa, esto normalmente significará correr en Hadoop YARN (así es como las distribuciones Cloudera y Hortonworks corren los trabajos de Spark), pero Apache Spark también puede correr en Apache Mesos, Kubernetes y Docker Swarm.


Recomendado: ¿Qué es el Big data?.


Si busca una solución administrada, entonces Apache Spark puede ser encontrado como parte de Amazon EMR, Google Cloud Dataproc, y Microsoft Azure HDInsight. Databricks, la empresa que emplea a los fundadores de Apache Spark, también ofrece la Plataforma Analítica Unificada de Databricks, que es un servicio gestionado integral que ofrece clusters de Apache Spark, soporte de streaming, desarrollo integrado de portátiles basados en la web, y un rendimiento optimizado de E/S en la nube sobre una distribución estándar de Apache Spark.

Apache Spark construye los comandos de procesamiento de datos del usuario en un Gráfico Acíclico Dirigidoo DAG. El DAG es la capa de programación de Apache Spark; determina qué tareas se ejecutan en qué nodos y en qué secuencia.

Spark vs. Hadoop: ¿Por qué usar Apache Spark?

Vale la pena señalar que Apache Spark vs. Apache Hadoop es un nombre un poco equivocado. Encontrarán Spark incluido en la mayoría de las distribuciones de Hadoop en estos días. Pero debido a dos grandes ventajas, Spark se ha convertido en el marco de elección cuando se procesan grandes datos, superando el viejo paradigma de MapReduce que llevó al Hadoop a la prominencia.

La primera ventaja es la velocidad. El motor de datos en memoria de Spark significa que puede realizar tareas hasta cien veces más rápido que MapReduce en ciertas situaciones, particularmente cuando se lo compara con trabajos multi-etapa que requieren la escritura del estado de vuelta al disco entre etapas. En esencia, MapReduce crea un gráfico de ejecución de dos etapas que consiste en mapear y reducir datos, mientras que el DAG de Apache Spark tiene múltiples etapas que pueden ser distribuidas más eficientemente. Incluso los trabajos de Apache Spark en los que los datos no pueden estar completamente contenidos en la memoria tienden a ser alrededor de 10 veces más rápidos que su contraparte de MapReduce.

La segunda ventaja es el API de Spark , fácil de desarrollar. Por muy importante que sea la rapidez de Spark, se podría argumentar que la amabilidad del API de Spark es aún más importante.

Núcleo de Spark

En comparación con MapReduce y otros componentes de Apache Hadoop, la API de Apache Spark es muy amigable para los desarrolladores, ocultando gran parte de la complejidad de un motor de procesamiento distribuido detrás de simples llamadas a métodos. El ejemplo canónico de esto es cómo casi 50 líneas de código de MapReduce para contar palabras en un documento pueden ser reducidas a sólo unas pocas líneas de Apache Spark (aquí mostrado en Scala):

val textFile = sparkSession.sparkContext.textFile(“hdfs:///tmp/words”)
val counts = textFile.flatMap(line => line.split(“ “))
                      .map(word => (word, 1))
                      .reduceByKey(_ + _)
counts.saveAsTextFile(“hdfs:///tmp/words_agg”)

Al proporcionar enlaces a lenguajes populares para el análisis de datos como Python y R, así como a Java y Scala, que son más fáciles de usar para las empresas, Apache Spark permite a todos, desde los desarrolladores de aplicaciones hasta los científicos de datos, aprovechar su escalabilidad y velocidad de manera accesible.

Spark RDD

En el corazón de Apache Spark se encuentra el concepto del Resistente Conjunto de Datos Distribuidos (RDD), una abstracción de programación que representa una colección inmutable de objetos que pueden ser divididos a través de un clúster de computación. Las operaciones en los RDDs también pueden ser divididas a través del cluster y ejecutadas en un proceso paralelo por lotes, lo que lleva a un procesamiento paralelo rápido y escalable.

Los RDDs pueden ser creados a partir de simples archivos de texto, bases de datos SQL, almacenes NoSQL (como Cassandra y MongoDB), cubos de Amazon S3, y mucho más. Gran parte de la API de Spark Core se basa en este concepto de RDD, lo que permite mapear y reducir la funcionalidad tradicional, pero también proporciona soporte incorporado para unir conjuntos de datos, filtrar, muestrear y agregar.

Spark funciona de manera distribuida combinando un conductor proceso central que divide una aplicación de Spark en tareas y las distribuye entre muchas ejecutor procesos que hacen el trabajo. Estos ejecutores pueden ser ampliados y reducidos según las necesidades de la aplicación.

Spark SQL

Conocido originalmente como Shark, Spark SQL se ha convertido cada vez más importante para el proyecto Apache Spark. Es probablemente la interfaz más utilizada por los desarrolladores de hoy en día al crear aplicaciones. Spark SQL se centra en el procesamiento de datos estructurados, utilizando un enfoque de dataframe tomado de R y Python (en Pandas). Pero como su nombre indica, el Spark SQL también proporciona una interfaz compatible con SQL2003 para la consulta de datos, llevando la potencia del Apache Spark tanto a los analistas como a los desarrolladores.

Además del soporte estándar de SQL, Spark SQL proporciona una interfaz estándar para leer y escribir en otras bases de datos como JSON, HDFS, Apache Hive, JDBC, Apache ORC, y Apache Parquet, todas ellas soportadas desde el principio. Otras tiendas populares -Apache Cassandra, MongoDB, Apache HBase, y muchas otras- pueden ser utilizadas tirando de conectores separados del ecosistema de Spark Packages.

Seleccionar algunas columnas de un marco de datos es tan simple como esta línea:

citiesDF.select(“name”, “pop”)

Usando la interfaz SQL, registramos el marco de datos como una tabla temporal, después de lo cual podemos emitir consultas SQL contra él:

citiesDF.createOrReplaceTempView(“cities”)
spark.sql(“SELECT name, pop FROM cities”)

Entre bastidores, Apache Spark utiliza un optimizador de consultas llamado Catalyst que examina los datos y las consultas para producir un plan de consulta eficiente para la localización de datos y el cálculo que realizará los cálculos necesarios en todo el cúmulo. En la era Apache Spark 2.x, la interfaz Spark SQL de cuadros de datos y conjuntos de datos (esencialmente un cuadro de datos mecanografiado que puede comprobarse en el momento de la compilación para comprobar su corrección y aprovechar otras optimizaciones de memoria y de cálculo en tiempo de ejecución) es el enfoque recomendado para el desarrollo. La interfaz RDD sigue estando disponible, pero se recomienda sólo si sus necesidades no pueden ser atendidas dentro del paradigma Spark SQL.

Spark 2.4 introdujo un conjunto de funciones de orden superior incorporadas para manipular directamente conjuntos y otros tipos de datos de orden superior.

Spark MLlib

Apache Spark también incluye bibliotecas para aplicar el aprendizaje de la máquina y técnicas de análisis de gráficos a los datos a escala. Spark MLlib incluye un marco de trabajo para crear conductos de aprendizaje automático, permitiendo una fácil implementación de la extracción, selección y transformación de características en cualquier conjunto de datos estructurado. MLlib viene con implementaciones distribuidas de algoritmos de agrupación y clasificación, como la agrupación de k-means y los bosques aleatorios, que pueden intercambiarse con facilidad en tuberías personalizadas. Los científicos de datos pueden entrenar los modelos en Apache Spark utilizando R o Python, guardarlos utilizando MLlib y luego importarlos a un conducto basado en Java o en Scala para su uso en la producción.

Nótese que mientras que Spark MLlib cubre el aprendizaje básico de la máquina incluyendo la clasificación, regresión, agrupación y filtrado, no incluye facilidades para modelar y entrenar redes neuronales profundas (para más detalles ver la revisión de Spark MLlib de InfoWorld). Sin embargo, se está trabajando en las tuberías de aprendizaje profundo.

Spark GraphX

Spark GraphX viene con una selección de algoritmos distribuidos para el procesamiento de estructuras de gráficos, incluyendo una implementación del PageRank de Google. Estos algoritmos utilizan el enfoque RDD de Spark Core para modelar datos; el paquete GraphFrames permite realizar operaciones de gráficos en dataframes, incluyendo el aprovechamiento del optimizador Catalyst para consultas de gráficos.

Spark Streaming

Spark Streaming fue una de las primeras adiciones al Apache Spark que le ayudó a ganar tracción en entornos que requerían un procesamiento en tiempo real o casi en tiempo real. Anteriormente, el procesamiento por lotes y por flujos en el mundo de Apache Hadoop eran cosas separadas. Escribías el código de MapReduce para tus necesidades de procesamiento por lotes y usabas algo como Apache Storm para tus necesidades de streaming en tiempo real. Esto obviamente lleva a bases de código dispares que necesitan mantenerse sincronizadas para el dominio de la aplicación a pesar de estar basadas en marcos de trabajo completamente diferentes, que requieren diferentes recursos, y que implican diferentes preocupaciones operacionales para su ejecución.

Spark Streaming amplió el concepto de procesamiento por lotes de Apache Spark a la transmisión por secuencias, dividiendo la secuencia en una serie continua de microlotes, que luego podían ser manipulados utilizando la API de Apache Spark. De esta manera, el código en lotes y las operaciones de streaming pueden compartir (en su mayoría) el mismo código, ejecutándose en el mismo marco de trabajo, reduciendo así los gastos de los desarrolladores y los operadores. Todo el mundo gana.

Una crítica al enfoque de la transmisión por Spark es que los microbatches, en los escenarios en los que se requiere una respuesta de baja latencia a los datos entrantes, pueden no ser capaces de igualar el rendimiento de otros marcos con capacidad de transmisión como Apache Storm, Apache Flink y Apache Apex, todos los cuales utilizan un método de transmisión puro en lugar de microbatches.

Transmisión estructurada

Structured Streaming (añadido en Spark 2.x) es a Spark Streaming lo que Spark SQL era a las APIs de Spark Core: Una API de nivel superior y una abstracción más fácil para escribir aplicaciones. En el caso de Structure Streaming, la API de nivel superior permite esencialmente a los desarrolladores crear infinitos marcos de datos y conjuntos de datos de streaming. También resuelve algunos puntos problemáticos muy reales con los que los usuarios han tenido dificultades en el marco anterior, especialmente en lo que respecta a la gestión de las agregaciones de eventos y la entrega tardía de los mensajes. Todas las consultas sobre flujos estructurados pasan por el optimizador de consultas de Catalyst, e incluso pueden ejecutarse de manera interactiva, permitiendo a los usuarios realizar consultas SQL contra datos de flujo continuo en directo.

El Streaming Estructurado originalmente se basaba en el esquema de microbatching de Spark Streaming para manejar datos de streaming. Pero en Spark 2.3, el equipo de Apache Spark añadió un modo de procesamiento continuo de baja latencia al Streaming Estructurado, permitiéndole manejar respuestas con latencias tan bajas como 1ms, lo cual es muy impresionante. A partir de la Spark 2.4, el Procesamiento Continuo se considera todavía experimental. Mientras que el Streaming Estructurado está construido sobre el motor Spark SQL, el Streaming Continuo sólo soporta un conjunto restringido de consultas.

El Streaming Estructurado es el futuro de las aplicaciones de streaming con la plataforma, así que si estás construyendo una nueva aplicación de streaming, deberías usar el Streaming Estructurado. Las APIs heredadas de Spark Streaming continuarán siendo soportadas, pero el proyecto recomienda portarlas a Structured Streaming, ya que el nuevo método hace que escribir y mantener el código de streaming sea mucho más soportable.

Tuberías de aprendizaje profundo

Apache Spark apoya el aprendizaje profundo a través de las tuberías de aprendizaje profundo. Usando la estructura de tuberías existente en MLlib, puede llamar a bibliotecas de aprendizaje profundo de nivel inferior y construir clasificadores en sólo unas pocas líneas de código, así como aplicar gráficos personalizados de TensorFlow o modelos de Keras a los datos entrantes. Estos gráficos y modelos pueden incluso registrarse como UDF Spark SQL personalizados (funciones definidas por el usuario) para que los modelos de aprendizaje profundo puedan aplicarse a los datos como parte de las instrucciones SQL.

Tutoriales de Apache Spark

¿Listo para zambullirse y aprender la Spark Apache? Recomendamos encarecidamente A Neanderthal’s Guide to Apache Spark in Python de Evan Heitman, que no sólo expone los fundamentos del funcionamiento de Apache Spark en términos relativamente sencillos, sino que también te guía a través del proceso de escribir una sencilla aplicación en Python que haga uso del marco de trabajo. El artículo está escrito desde la perspectiva de un científico de datos, lo que tiene sentido ya que la ciencia de los datos es un mundo en el que los grandes datos y el aprendizaje de las máquinas son cada vez más críticos.

Si estás buscando algunos ejemplos de Apache Spark para darte una idea de lo que la plataforma puede hacer y cómo lo hace, echa un vistazo a Spark By {Ejemplos}. Hay muchos ejemplos de código aquí para varias de las tareas básicas que componen los bloques de construcción de la programación de Spark, para que puedas ver los componentes que componen las tareas más grandes para las que está hecho Apache Spark.

¿Necesitas ir más profundo? DZone tiene lo que modestamente se refiere como La Colección Completa de Apache Spark, que consiste en un montón de útiles tutoriales sobre muchos temas de Apache Spark. Feliz aprendizaje!