¿Qué es Apache Spark? La plataforma de big data que aplastó a Hadoop

Apache Spark definido

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 tareas de procesamiento de datos en 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 del big data y el aprendizaje automático, que requieren la ordenación de una potencia informática masiva para procesar grandes almacenes de datos. Spark también elimina 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 duro de la computación distribuida y el procesamiento de big data.

Desde sus humildes comienzos en AMPLab en UC Berkeley en 2009, Apache Spark se ha convertido en uno de los marcos de procesamiento distribuidos de big data clave en el mundo. Spark se puede implementar de diversas formas, proporciona enlaces nativos para los lenguajes de programación Java, Scala, Python y R, y admite SQL, transmisión de datos, aprendizaje automático y procesamiento de gráficos. Lo encontrará utilizado por bancos, empresas de telecomunicaciones, empresas de juegos, gobiernos y todos los grandes gigantes tecnológicos como Apple, Facebook, IBM y Microsoft.

Arquitectura de Apache Spark

En un nivel fundamental, una aplicación Apache Spark consta de dos componentes principales: un controlador, que convierte el código del usuario en múltiples tareas que se pueden distribuir entre los nodos trabajadores, y ejecutores, que se ejecutan en esos nodos y ejecutan las tareas que se les asignan. Es necesaria alguna forma de administrador de clúster para mediar entre los dos.

De fábrica, Spark se puede ejecutar en un modo de clúster independiente que simplemente requiere el marco Apache Spark y una JVM en cada máquina de su clúster. Sin embargo, es más probable que desee aprovechar un sistema de administración de recursos o clústeres más sólido para encargarse de asignar trabajadores a pedido. En la empresa, esto normalmente significará ejecutar en Hadoop YARN (así es como las distribuciones Cloudera y Hortonworks ejecutan trabajos de Spark), pero Apache Spark también se puede ejecutar en Apache Mesos, Kubernetes y Docker Swarm.

Si busca una solución administrada, Apache Spark se puede encontrar como parte de Amazon EMR, Google Cloud Dataproc y Microsoft Azure HDInsight. Databricks, la compañía que emplea a los fundadores de Apache Spark, también ofrece Databricks Unified Analytics Platform, que es un servicio administrado integral que ofrece clústeres de Apache Spark, soporte de transmisión, desarrollo integrado de notebook basado en la web y rendimiento optimizado de E / S en la nube. una distribución estándar de Apache Spark.

Apache Spark crea los comandos de procesamiento de datos del usuario en un gráfico acíclico dirigido o 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 poco apropiado. Encontrará 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 al procesar big data, superando el antiguo paradigma MapReduce que llevó a 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 compara con trabajos de múltiples etapas que requieren la escritura de estado en disco entre etapas. En esencia, MapReduce crea un gráfico de ejecución de dos etapas que consiste en la asignación y reducción de datos, mientras que el DAG de Apache Spark tiene múltiples etapas que se pueden distribuir de manera más eficiente. Incluso los trabajos de Apache Spark donde 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 la API Spark amigable para desarrolladores. Tan importante como es la aceleración de Spark, se podría argumentar que la simpatía de la API de Spark es aún más importante.

Spark Core

En comparación con MapReduce y otros componentes de Apache Hadoop, la API de Apache Spark es muy amigable para los desarrolladores, ya que oculta 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 MapReduce para contar palabras en un documento se pueden reducir a solo unas pocas líneas de Apache Spark (aquí se muestra en Scala):

val textFile = sparkSession.sparkContext.textFile ("hdfs: /// tmp / palabras")

val count = textFile.flatMap (línea => línea.split (""))

                      .map (palabra => (palabra, 1))

                      .reduceByKey (_ + _)

count.saveAsTextFile ("hdfs: /// tmp / words_agg")

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

Spark RDD

En el corazón de Apache Spark se encuentra el concepto de Resilient Distributed Dataset (RDD), una abstracción de programación que representa una colección inmutable de objetos que se pueden dividir en un clúster informático. Las operaciones en los RDD también se pueden dividir en el clúster y ejecutar en un proceso por lotes paralelo, lo que lleva a un procesamiento paralelo rápido y escalable.

Los RDD se pueden crear a partir de archivos de texto simples, bases de datos SQL, tiendas NoSQL (como Cassandra y MongoDB), buckets de Amazon S3 y mucho más. Gran parte de la API Spark Core se basa en este concepto de RDD, lo que permite el mapa tradicional y reduce la funcionalidad, pero también brinda soporte integrado para unir conjuntos de datos, filtrar, muestrear y agregar.

Spark se ejecuta de forma distribuida combinando un proceso principal de controlador que divide una aplicación Spark en tareas y las distribuye entre muchos procesos ejecutores que hacen el trabajo. Estos ejecutores se pueden escalar hacia arriba y hacia abajo según sea necesario para las necesidades de la aplicación.

Spark SQL

Originalmente conocido como Shark, Spark SQL se ha vuelto cada vez más importante para el proyecto Apache Spark. Es probable que sea la interfaz más utilizada por los desarrolladores actuales al crear aplicaciones. Spark SQL se centra en el procesamiento de datos estructurados, utilizando un enfoque de marco de datos tomado de R y Python (en Pandas). Pero como sugiere el nombre, Spark SQL también proporciona una interfaz compatible con SQL2003 para consultar datos, lo que lleva el poder de Apache Spark a analistas y desarrolladores.

Además de la compatibilidad con SQL estándar, Spark SQL proporciona una interfaz estándar para leer y escribir en otros almacenes de datos, incluidos JSON, HDFS, Apache Hive, JDBC, Apache ORC y Apache Parquet, todos los cuales son compatibles desde el primer momento. Otras tiendas populares (Apache Cassandra, MongoDB, Apache HBase y muchas otras) se pueden utilizar al extraer conectores separados del ecosistema Spark Packages.

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

citiesDF.select ("nombre", "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 ("ciudades")

spark.sql ("SELECT nombre, pop FROM ciudades")

Detrás de escena, 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 y el cálculo de los datos que realizará los cálculos necesarios en todo el clúster. En la era Apache Spark 2.x, la interfaz Spark SQL de marcos de datos y conjuntos de datos (esencialmente un marco de datos con tipo que se puede verificar en el momento de la compilación para verificar su exactitud y aprovechar la memoria adicional y las optimizaciones de cómputo en el tiempo de ejecución) es el enfoque recomendado para el desarrollo. . La interfaz RDD todavía está disponible, pero se recomienda solo si sus necesidades no se pueden abordar dentro del paradigma Spark SQL.

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

Spark MLlib

Apache Spark también incluye bibliotecas para aplicar técnicas de análisis de gráficos y aprendizaje automático a los datos a escala. Spark MLlib incluye un marco para crear canalizaciones de aprendizaje automático, lo que permite una fácil implementación de la extracción de características, las selecciones y las transformaciones en cualquier conjunto de datos estructurados. MLlib viene con implementaciones distribuidas de agrupación en clústeres y algoritmos de clasificación, como agrupación en clústeres k-means y bosques aleatorios que se pueden intercambiar dentro y fuera de canalizaciones personalizadas con facilidad. Los científicos de datos pueden entrenar los modelos en Apache Spark usando R o Python, guardarlos usando MLlib y luego importarlos a una canalización basada en Java o Scala para su uso en producción.

Tenga en cuenta que, si bien Spark MLlib cubre el aprendizaje automático básico, incluida la clasificación, la regresión, la agrupación en clústeres y el filtrado, no incluye funciones para modelar y entrenar redes neuronales profundas (para obtener más detalles, consulte la revisión de Spark MLlib). Sin embargo, las canalizaciones de aprendizaje profundo están en proceso.

Spark GraphX

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

Spark Streaming

Spark Streaming fue una adición temprana a Apache Spark que lo ayudó a ganar tracción en entornos que requerían procesamiento en tiempo real o casi en tiempo real. Anteriormente, el procesamiento por lotes y de flujo en el mundo de Apache Hadoop eran cosas separadas. Escribiría código MapReduce para sus necesidades de procesamiento por lotes y usaría algo como Apache Storm para sus requisitos de transmisión en tiempo real. Obviamente, esto conduce a bases de código dispares que deben mantenerse sincronizadas para el dominio de la aplicación a pesar de estar basadas en marcos completamente diferentes, que requieren diferentes recursos y que involucran diferentes preocupaciones operativas para ejecutarlos.

Spark Streaming extendió el concepto de procesamiento por lotes de Apache Spark a la transmisión al dividir la transmisión en una serie continua de microbatches, que luego podrían manipularse mediante la API de Apache Spark. De esta manera, el código en las operaciones por lotes y de transmisión puede compartir (en su mayoría) el mismo código, ejecutándose en el mismo marco, reduciendo así la sobrecarga tanto del desarrollador como del operador. Todo el mundo gana.

Una crítica al enfoque de Spark Streaming es que el microbatching, en escenarios donde se requiere una respuesta de baja latencia a los datos entrantes, puede no ser capaz 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 pura en lugar de micro lotes.

Streaming estructurado

Streaming estructurado (agregado en Spark 2.x) es para Spark Streaming lo que Spark SQL era para las API de Spark Core: una API de nivel superior y una abstracción más sencilla para escribir aplicaciones. En el caso de Structure Streaming, la API de nivel superior esencialmente permite a los desarrolladores crear marcos de datos y conjuntos de datos de transmisión infinita. También resuelve algunos puntos débiles muy reales con los que los usuarios han luchado en el marco anterior, especialmente en lo que respecta al manejo de agregaciones de eventos y entrega tardía de mensajes. Todas las consultas en transmisiones estructuradas pasan por el optimizador de consultas de Catalyst e incluso se pueden ejecutar de manera interactiva, lo que permite a los usuarios realizar consultas SQL con datos de transmisión en vivo.

La transmisión estructurada se basó originalmente en el esquema de micro lotes de Spark Streaming para manejar los datos de transmisión. Pero en Spark 2.3, el equipo de Apache Spark agregó un modo de procesamiento continuo de baja latencia a la transmisión estructurada, lo que le permite manejar respuestas con latencias tan bajas como 1 ms, lo cual es muy impresionante. A partir de Spark 2.4, el procesamiento continuo todavía se considera experimental. Si bien la transmisión estructurada se basa en el motor Spark SQL, la transmisión continua solo admite un conjunto restringido de consultas.

La transmisión estructurada es el futuro de las aplicaciones de transmisión con la plataforma, por lo que si está creando una nueva aplicación de transmisión, debe utilizar la transmisión estructurada. Las API de Spark Streaming heredadas seguirán siendo compatibles, pero el proyecto recomienda la migración a Structured Streaming, ya que el nuevo método hace que escribir y mantener el código de transmisión sea mucho más llevadero.

Canalizaciones de aprendizaje profundo

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

Tutoriales de Apache Spark

¿Listo para sumergirte y aprender Apache Spark? Recomendamos encarecidamente A Neanderthal's Guide to Apache Spark en Python de Evan Heitman, que no solo establece los conceptos básicos de cómo funciona Apache Spark en términos relativamente simples, sino que también lo guía a través del proceso de escribir una aplicación Python simple que hace uso del marco. . El artículo está escrito desde la perspectiva de un científico de datos, lo que tiene sentido ya que la ciencia de datos es un mundo en el que el big data y el aprendizaje automático son cada vez más críticos.

Si está buscando algunos ejemplos de Apache Spark para tener una idea de lo que puede hacer la plataforma y cómo lo hace, consulte Spark By {Examples}. Aquí hay un montón de código de muestra para varias de las tareas básicas que componen los componentes básicos de la programación de Spark, por lo que puede ver los componentes que componen las tareas más grandes para las que está hecho Apache Spark.

¿Necesitas profundizar? DZone tiene lo que modestamente se conoce como The Complete Apache Spark Collection, que consiste en una gran cantidad de útiles tutoriales sobre muchos temas de Apache Spark. ¡Feliz aprendizaje!