¿Qué es Apache Spark? Definición, para qué sirve.Apache Spark, rápido, flexible y fácil de usar para los desarrolladores, es la plataforma líder para SQL a gran escala, procesamiento por lotes, procesamiento continuo y aprendizaje automático.
Desde sus humildes comienzos en el AMPLab en UC Berkeley en 2009, Apache Spark se ha convertido en uno de los marcos de procesamiento de datos distribuidos clave de big data en el mundo.
Spark se puede implementar de varias maneras, 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. Encontrará que lo utilizan bancos, compañías de telecomunicaciones, compañías de juegos, gobiernos y todos los principales gigantes tecnológicos como Apple, Facebook, IBM y Microsoft.
Fuera de la caja, Spark puede ejecutarse en un modo de clúster independiente 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 desee aprovechar un recurso o un sistema de administración de clústeres para ocuparse de asignar trabajadores a pedido. En la empresa, esto normalmente significará ejecutarse en Hadoop YARN (así es como las distribuciones de Cloudera y Hortonworks ejecutan trabajos Spark), pero Apache Spark también puede ejecutarse en Apache Mesos , mientras que el trabajo avanza en la adición de soporte nativo para Kubernetes .
Si está buscando 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 la Plataforma de análisis unificados de Databricks , que es un servicio administrado integral que ofrece clusters de Apache Spark, soporte de transmisión en tiempo real, desarrollo integrado de notebooks basadas en web y rendimiento optimizado de E / S en la nube sobre Una distribución estándar de Apache Spark.
Spark contra Hadoop
Vale la pena señalar que Apache Spark contra Apache Hadoop es un nombre poco apropiado. Encontrarás 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 procesa big data, superando el antiguo paradigma MapReduce que llevó a Hadoop a la fama.
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 del estado en el disco entre etapas. Incluso los trabajos de Apache Spark donde los datos no pueden estar completamente contenidos en la memoria tienden a ser aproximadamente 10 veces más rápidos que su contraparte MapReduce.
La segunda ventaja es la API Spark, amigable para el desarrollador. Tan importante como la aceleración de Spark es, se podría argumentar que la amabilidad de la 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, 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 de MapReduce para contar palabras en un documento se pueden reducir a solo unas pocas líneas de Apache Spark .
Al proporcionar enlaces a lenguajes populares para el análisis de datos como Python y R, así como a Java y Scala más aptos para la empresa, Apache Spark permite a todos, desde desarrolladores de aplicaciones hasta científicos de datos, aprovechar su escalabilidad y velocidad de una manera accesible.
Spark RDD
En el corazón de Apache Spark se encuentra el concepto del Conjunto de datos distribuido resistente ( RDD ), una abstracción de programación que representa una colección inmutable de objetos que se pueden dividir en un grupo de computación. Las operaciones en los RDD también pueden dividirse en el clúster y ejecutarse 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, almacenes NoSQL (como Cassandra y MongoDB), depósitos de Amazon S3 y mucho más. Gran parte de la API de Spark Core se basa en este concepto RDD, lo que permite un mapa tradicional y reduce la funcionalidad, pero también proporciona soporte integrado para unir conjuntos de datos, filtrado, muestreo y agregación.
Spark se ejecuta de forma distribuida al combinar un proceso de núcleo de controlador que divide una aplicación de Spark en tareas y las distribuye entre muchos procesos ejecutores que hacen el trabajo. Estos ejecutores pueden escalarse 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 de hoy en día 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 su nombre, Spark SQL también proporciona una interfaz compatible con SQL2003 para consultar datos, lo que brinda el poder de Apache Spark a analistas y desarrolladores.
Junto con el soporte estándar de SQL, 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 de forma inmediata. Otras tiendas populares (Apache Cassandra, MongoDB, Apache HBase y muchas otras) se pueden usar al jalar conectores separados del ecosistema de Spark Packages .
Detrás de escena, Apache Spark utiliza un optimizador de consultas llamado Catalyst que examina los datos y las consultas para generar un plan de consultas eficiente para la localidad de los datos y los cálculos que realizarán los cálculos necesarios en todo el clúster. En la era de Apache Spark 2.x, la interfaz Spark SQL de marcos de datos y conjuntos de datos (esencialmente un marco de datos mecanografiado que puede verificarse en el momento de la compilación para ver si está correcto y aprovechar la memoria adicional y las optimizaciones informáticas en tiempo de ejecución) es el enfoque recomendado para el desarrollo. . La interfaz RDD aún está disponible, pero se recomienda solo si tiene necesidades que no se pueden encapsular dentro del paradigma Spark SQL.
Spark MLlib
Apache Spark también agrupa bibliotecas para aplicar el aprendizaje automático y técnicas de análisis de gráficos a datos a escala. Spark MLlib incluye un marco para la creación de líneas de aprendizaje automático, lo que permite una implementación sencilla 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 agrupamiento y clasificación, como el agrupamiento k-means y bosques aleatorios que pueden intercambiarse dentro y fuera de las tuberías personalizadas con facilidad. Los científicos de datos en Apache Spark pueden capacitar a los modelos con R o Python, guardarlos con MLLib y luego importarlos a un pipeline basado en Java o Scala para uso de producción.
Tenga en cuenta que si bien Spark MLlib cubre el aprendizaje automático básico que incluye clasificación, regresión, agrupación y filtrado, no incluye instalaciones para el modelado y entrenamiento de redes neuronales profundas.
Spark GraphX
Spark GraphX viene con una selección de algoritmos distribuidos para procesar estructuras gráficas que incluyen una implementación del PageRank de Google . Estos algoritmos utilizan el enfoque RDD de Spark Core para modelar datos; la GraphFrames paquete le permite hacer operaciones con gráficos en tramas de datos, incluyendo aprovechando el optimizador de catalizador para las consultas de gráficos.
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 el flujo en el mundo de Apache Hadoop eran cosas separadas. Escribiría el código de 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 e implican diferentes preocupaciones operativas para ejecutarlos.
Spark Streaming extendió el concepto de Apache Spark de procesamiento por lotes en transmisión al dividir el flujo en una serie continua de micropartes, que luego podrían manipularse utilizando la API de Apache Spark. De esta manera, el código en lotes y las operaciones de transmisión pueden compartir (en su mayoría) el mismo código, ejecutándose en el mismo marco, lo que reduce la sobrecarga tanto para el desarrollador como para el operador. Todo el mundo gana.
Una crítica al enfoque de Spark Streaming es que es posible que las microparches, en escenarios donde se requiere una respuesta de baja latencia a los datos entrantes, no puedan igualar el rendimiento de otros marcos compatibles con el streaming como Apache Storm, Apache Flink y Apache Apex . todos los cuales utilizan un método de transmisión pura en lugar de microparches.
Streaming estructurado
Streaming estructurado (agregado en Spark 2.x) es para Spark Streaming lo que Spark SQL fue 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 infinitos marcos de datos y conjuntos de datos. También resuelve algunos puntos problemáticos muy reales con los que los usuarios han luchado en el marco anterior, especialmente en lo que respecta a tratar con agregaciones de eventos y entrega tardía de mensajes. Todas las consultas en flujos estructurados pasan por el optimizador de consultas Catalyst, e incluso pueden ejecutarse de manera interactiva, lo que permite a los usuarios realizar consultas SQL contra datos de transmisión en vivo.
La transmisión estructurada sigue siendo una parte bastante nueva de Apache Spark, ya que se ha marcado como lista para producción en la versión Spark 2.2. Sin embargo, Structured Streaming es el futuro de las aplicaciones de transmisión por secuencias con la plataforma, por lo que si está creando una nueva aplicación de transmisión, debe usar Structured Streaming. Las API de Spark Streaming heredadas seguirán siendo compatibles, pero el proyecto recomienda migrar a Streaming estructurado, ya que el nuevo método hace que la escritura y el mantenimiento del código de transmisión sean mucho más soportables.
¿Qué sigue para Apache Spark?
Aunque Structured Streaming proporciona mejoras de alto nivel para Spark Streaming, actualmente se basa en el mismo esquema de microcontaminación para el manejo de datos de streaming. Sin embargo, el equipo de Apache Spark está trabajando para llevar la transmisión continua sin microbatching a la plataforma, lo que debería resolver muchos de los problemas con el manejo de respuestas de baja latencia (reclaman ~ 1 ms, lo que sería muy impresionante). Aún mejor, debido a que la transmisión estructurada está construida sobre el motor Spark SQL, aprovechar esta nueva técnica de transmisión no requerirá cambios de código.
Además de mejorar el rendimiento de transmisión, Apache Spark agregará soporte para el aprendizaje profundo a través de Deep Learning Pipelines . Al utilizar la estructura de canalización existente de MLlib, podrá construir clasificadores en solo 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 personalizadas (funciones definidas por el usuario) para que los modelos de aprendizaje profundo puedan aplicarse a los datos como parte de las sentencias de SQL.