Autor(es) original(es) | Matei Zaharia |
---|---|
Desarrollador(es) | Apache Spark |
Lanzamiento inicial | 26 de mayo de 2014; hace 10 años (2014-05-26) |
Versión estable | 3.5.2 ( Scala 2.13) / 10 de agosto de 2024 ( 10/08/2024 ) |
Repositorio | Repositorio Spark |
Escrito en | Escala [1] |
Sistema operativo | Microsoft Windows , macOS , Linux |
Disponible en | Escala , Java , SQL , Python , R , C# , F# |
Tipo | Análisis de datos, algoritmos de aprendizaje automático |
Licencia | Licencia Apache 2.0 |
Sitio web | spark.apache.org |
Apache Spark es un motor de análisis unificado de código abierto para el procesamiento de datos a gran escala. Spark proporciona una interfaz para programar clústeres con paralelismo de datos implícito y tolerancia a fallos . Originalmente desarrollado en el AMPLab de la Universidad de California en Berkeley , el código base de Spark fue donado posteriormente a la Apache Software Foundation , que lo ha mantenido desde entonces.
Apache Spark tiene su base arquitectónica en el conjunto de datos distribuidos resilientes (RDD), un conjunto múltiple de elementos de datos de solo lectura distribuidos en un clúster de máquinas, que se mantiene de manera tolerante a fallas . [2] La API Dataframe se lanzó como una abstracción sobre el RDD, seguida por la API Dataset. En Spark 1.x, el RDD era la interfaz de programación de aplicaciones (API) principal, pero a partir de Spark 2.x se fomenta el uso de la API Dataset [3] aunque la API RDD no está obsoleta . [4] [5] La tecnología RDD aún sustenta la API Dataset. [6] [7]
Spark y sus RDD se desarrollaron en 2012 en respuesta a las limitaciones del paradigma de computación en clúster MapReduce , que impone una estructura de flujo de datos lineal particular en los programas distribuidos: los programas MapReduce leen datos de entrada del disco, asignan una función a los datos, reducen los resultados del mapa y almacenan los resultados de la reducción en el disco. Los RDD de Spark funcionan como un conjunto de trabajo para programas distribuidos que ofrece una forma (deliberadamente) restringida de memoria compartida distribuida . [8]
Dentro de Apache Spark, el flujo de trabajo se administra como un gráfico acíclico dirigido (DAG). Los nodos representan los RDD, mientras que los bordes representan las operaciones en los RDD.
Spark facilita la implementación de algoritmos iterativos , que visitan su conjunto de datos varias veces en un bucle, y el análisis de datos interactivo/exploratorio, es decir, la consulta repetida de datos al estilo de una base de datos . La latencia de tales aplicaciones se puede reducir en varios órdenes de magnitud en comparación con la implementación de Apache Hadoop MapReduce. [2] [9] Entre la clase de algoritmos iterativos se encuentran los algoritmos de entrenamiento para sistemas de aprendizaje automático , que formaron el impulso inicial para el desarrollo de Apache Spark. [10]
Apache Spark requiere un administrador de clústeres y un sistema de almacenamiento distribuido . Para la administración de clústeres, Spark admite Spark nativo independiente, Hadoop YARN , Apache Mesos o Kubernetes . [11] Un clúster nativo independiente de Spark se puede iniciar manualmente o mediante los scripts de inicio proporcionados por el paquete de instalación. También es posible ejecutar los daemons en una sola máquina para realizar pruebas. Para el almacenamiento distribuido, Spark puede interactuar con una amplia variedad de sistemas distribuidos, incluidos Alluxio , Hadoop Distributed File System (HDFS) , [12] MapR File System (MapR-FS) , [13] Cassandra , [14] OpenStack Swift , Amazon S3 , Kudu , Lustre file system , [15] o se puede implementar una solución personalizada. Spark también admite un modo local pseudodistribuido, generalmente utilizado solo para fines de desarrollo o prueba, donde no se requiere almacenamiento distribuido y se puede usar el sistema de archivos local en su lugar; En tal escenario, Spark se ejecuta en una sola máquina con un ejecutor por núcleo de CPU .
Spark Core es la base del proyecto general. Proporciona despacho de tareas distribuidas, programación y funcionalidades básicas de E/S , expuestas a través de una interfaz de programación de aplicaciones (para Java , Python , Scala , .NET [16] y R ) centrada en la abstracción RDD (la API de Java está disponible para otros lenguajes JVM, pero también se puede utilizar para otros lenguajes que no son JVM que pueden conectarse a la JVM, como Julia [17] ). Esta interfaz refleja un modelo de programación funcional / de orden superior : un programa "controlador" invoca operaciones paralelas como map, filter o reduce en un RDD pasando una función a Spark, que luego programa la ejecución de la función en paralelo en el clúster. [2] Estas operaciones, y otras adicionales como joins , toman RDD como entrada y producen nuevos RDD. Los RDD son inmutables y sus operaciones son perezosas ; La tolerancia a fallas se logra al mantener un registro del "linaje" de cada RDD (la secuencia de operaciones que lo produjo) para que pueda reconstruirse en caso de pérdida de datos. Los RDD pueden contener cualquier tipo de objetos Python, .NET, Java o Scala.
Además del estilo funcional de programación orientado a RDD, Spark proporciona dos formas restringidas de variables compartidas: las variables de transmisión hacen referencia a datos de solo lectura que deben estar disponibles en todos los nodos, mientras que los acumuladores se pueden usar para programar reducciones en un estilo imperativo . [2]
Un ejemplo típico de programación funcional centrada en RDD es el siguiente programa de Scala que calcula las frecuencias de todas las palabras que aparecen en un conjunto de archivos de texto e imprime las más comunes. Cada map , flatMap (una variante de map ) y reduceByKey toma una función anónima que realiza una operación simple en un solo elemento de datos (o un par de elementos) y aplica su argumento para transformar un RDD en un nuevo RDD.
val conf = new SparkConf (). setAppName ( "wiki_test" ) // crea un objeto de configuración spark val sc = new SparkContext ( conf ) // Crea un contexto spark val data = sc . textFile ( "/path/to/somedir" ) // Lee archivos de "somedir" en un RDD de pares (nombre de archivo, contenido). val tokens = data . flatMap ( _ . split ( " " )) // Divide cada archivo en una lista de tokens (palabras). val wordFreq = tokens . map (( _ , 1 )). reduceByKey ( _ + _ ) // Agrega un conteo de uno a cada token, luego suma los conteos por tipo de palabra. wordFreq . sortBy ( s => - s . _2 ). map ( x => ( x . _2 , x . _1 )). top ( 10 ) // Obtiene las 10 palabras principales. Intercambie palabras y cuente para ordenar por conteo.
Spark SQL es un componente sobre Spark Core que introdujo una abstracción de datos llamada DataFrames, [a] que brinda soporte para datos estructurados y semiestructurados . Spark SQL proporciona un lenguaje específico de dominio (DSL) para manipular DataFrames en Scala , Java , Python o .NET . [16] También brinda soporte para lenguaje SQL, con interfaces de línea de comandos y servidor ODBC / JDBC . Aunque DataFrames carece de la verificación de tipos en tiempo de compilación que brindan los RDD, a partir de Spark 2.0, el DataSet fuertemente tipado también es totalmente compatible con Spark SQL.
importar org . apache . spark . sql . SparkSession val url = "jdbc:mysql://yourIP:yourPort/test?user=yourUsername;password=yourPassword" // URL para su servidor de base de datos. val spark = SparkSession . builder (). getOrCreate () // Crear un objeto de sesión Spark val df = spark . read . format ( "jdbc" ) . option ( "url" , url ) . option ( "dbtable" , "people" ) . load () df . printSchema () // Observa el esquema de este DataFrame. val countsByAge = df . groupBy ( "age" ). count () // Cuenta personas por edad //o alternativamente a través de SQL: //df.createOrReplaceTempView("people") //val countsByAge = spark.sql("SELECT age, count(*) FROM people GROUP BY age")
Spark Streaming utiliza la capacidad de programación rápida de Spark Core para realizar análisis de transmisión . Ingiere datos en minilotes y realiza transformaciones RDD en esos minilotes de datos. Este diseño permite que el mismo conjunto de código de aplicación escrito para análisis por lotes se use en análisis de transmisión, lo que facilita la implementación sencilla de la arquitectura lambda . [19] [20] Sin embargo, esta conveniencia viene con la penalización de una latencia igual a la duración del minilote. Otros motores de datos de transmisión que procesan evento por evento en lugar de en minilotes incluyen Storm y el componente de transmisión de Flink . [21] Spark Streaming tiene soporte integrado para consumir desde Kafka , Flume , Twitter , ZeroMQ , Kinesis y sockets TCP/IP . [22]
En Spark 2.x, también se proporciona una tecnología separada basada en conjuntos de datos, llamada Structured Streaming, que tiene una interfaz de nivel superior para admitir la transmisión. [23]
Spark se puede implementar en un centro de datos local tradicional así como en la nube . [24]
Spark MLlib es un marco de aprendizaje automático distribuido sobre Spark Core que, debido en gran parte a la arquitectura Spark basada en memoria distribuida, es hasta nueve veces más rápido que la implementación basada en disco utilizada por Apache Mahout (según los puntos de referencia realizados por los desarrolladores de MLlib contra las implementaciones de mínimos cuadrados alternos (ALS), y antes de que Mahout obtuviera una interfaz Spark), y escala mejor que Vowpal Wabbit . [25] Muchos algoritmos estadísticos y de aprendizaje automático comunes se han implementado y se envían con MLlib, lo que simplifica las canalizaciones de aprendizaje automático a gran escala , que incluyen:
GraphX es un marco de procesamiento de gráficos distribuido sobre Apache Spark. Debido a que se basa en RDD, que son inmutables, los gráficos son inmutables y, por lo tanto, GraphX no es adecuado para gráficos que necesitan actualizarse, y mucho menos de manera transaccional como una base de datos de gráficos . [27] GraphX proporciona dos API independientes para la implementación de algoritmos masivamente paralelos (como PageRank ): una abstracción Pregel y una API más general de estilo MapReduce. [28] A diferencia de su predecesor Bagel, que quedó formalmente obsoleto en Spark 1.6, GraphX tiene soporte completo para gráficos de propiedades (gráficos donde las propiedades se pueden adjuntar a los bordes y vértices). [29]
Al igual que Apache Spark, GraphX comenzó inicialmente como un proyecto de investigación en AMPLab y Databricks de UC Berkeley, y luego fue donado a la Apache Software Foundation y al proyecto Spark. [30]
Apache Spark tiene soporte integrado para Scala, Java, SQL, R y Python con soporte de terceros para .NET CLR, [31] Julia, [32] y más.
Spark fue iniciado inicialmente por Matei Zaharia en el AMPLab de la Universidad de California en Berkeley en 2009, y se convirtió en código abierto en 2010 bajo una licencia BSD . [33]
En 2013, el proyecto fue donado a la Apache Software Foundation y cambió su licencia a Apache 2.0 . En febrero de 2014, Spark se convirtió en un proyecto Apache de nivel superior . [34]
En noviembre de 2014, la empresa Databricks del fundador de Spark, M. Zaharia, estableció un nuevo récord mundial en clasificación a gran escala utilizando Spark. [35] [33]
Spark tuvo más de 1000 colaboradores en 2015, [36] lo que lo convierte en uno de los proyectos más activos de la Apache Software Foundation [37] y uno de los proyectos de big data de código abierto más activos .
Versión | Fecha de lanzamiento original | Última versión | Fecha de lanzamiento |
---|---|---|---|
Versión antigua, ya no se mantiene:0,5 | 12 de junio de 2012 | 0.5.2 | 22 de noviembre de 2012 |
Versión antigua, ya no se mantiene:0.6 | 15 de octubre de 2012 | 0.6.2 | 07-02-2013 |
Versión antigua, ya no se mantiene:0,7 | 27 de febrero de 2013 | 0.7.3 | 16 de julio de 2013 |
Versión antigua, ya no se mantiene:0,8 | 25 de septiembre de 2013 | 0.8.1 | 19 de diciembre de 2013 |
Versión antigua, ya no se mantiene:0.9 | 02-02-2014 | 0.9.2 | 23 de julio de 2014 |
Versión antigua, ya no se mantiene:1.0 | 26 de mayo de 2014 | 1.0.2 | 5 de agosto de 2014 |
Versión antigua, ya no se mantiene:1.1 | 11 de septiembre de 2014 | 1.1.1 | 26 de noviembre de 2014 |
Versión antigua, ya no se mantiene:1.2 | 18 de diciembre de 2014 | 1.2.2 | 17 de abril de 2015 |
Versión antigua, ya no se mantiene:1.3 | 13 de marzo de 2015 | 1.3.1 | 17 de abril de 2015 |
Versión antigua, ya no se mantiene:1.4 | 11 de junio de 2015 | 1.4.1 | 15 de julio de 2015 |
Versión antigua, ya no se mantiene:1.5 | 09-09-2015 | 1.5.2 | 09-11-2015 |
Versión antigua, ya no se mantiene:1.6 | 04-01-2016 | 1.6.3 | 7 de noviembre de 2016 |
Versión antigua, ya no se mantiene:2.0 | 26 de julio de 2016 | 2.0.2 | 14 de noviembre de 2016 |
Versión antigua, ya no se mantiene:2.1 | 28 de diciembre de 2016 | 2.1.3 | 26 de junio de 2018 |
Versión antigua, ya no se mantiene:2.2 | 11 de julio de 2017 | 2.2.3 | 11 de enero de 2019 |
Versión antigua, ya no se mantiene:2.3 | 28-02-2018 | 2.3.4 | 09-09-2019 |
Versión antigua, ya no se mantiene:2,4 litros | 2 de noviembre de 2018 | 2.4.8 | 17 de mayo de 2021 [38] |
Versión antigua, ya no se mantiene:3.0 | 18 de junio de 2020 | 3.0.3 | 01-06-2021 [39] |
Versión antigua, ya no se mantiene:3.1 | 02-03-2021 | 3.1.3 | 18 de febrero de 2022 [40] |
Versión antigua, ya no se mantiene:3.2 | 13 de octubre de 2021 | 3.2.4 | 13 de abril de 2023 [41] |
Versión estable actual: 3.3 | 16 de junio de 2022 | 3.3.3 | 21 de agosto de 2023 [42] |
Versión estable actual: 3.4 | 13 de abril de 2023 | 3.4.3 | 18 de abril de 2024 [43] |
Versión estable actual: 3.5 | 09-09-2023 | 3.5.2 | 10 de agosto de 2024 [44] |
Leyenda: Versión antigua, sin mantenimiento Versión antigua, aún mantenida Última versión Última versión preliminar Lanzamiento futuro |
Spark 3.5.2 se basa en Scala 2.13 (y por lo tanto funciona con Scala 2.12 y 2.13 de manera inmediata), pero también se puede hacer que funcione con Scala 3. [45]
Apache Spark es desarrollado por una comunidad. El proyecto está gestionado por un grupo llamado "Comité de Gestión de Proyectos" (PMC). [46]
Por lo general, las ramas de lanzamiento de funciones se mantendrán con lanzamientos de corrección de errores durante un período de 18 meses. Por ejemplo, la rama 2.3.x ya no se considera mantenida a partir de septiembre de 2019, 18 meses después del lanzamiento de 2.3.0 en febrero de 2018. No se deben esperar más lanzamientos de 2.3.x después de ese punto, ni siquiera para correcciones de errores.
La última versión menor dentro de una versión principal normalmente se mantendrá durante más tiempo como una versión “LTS”. Por ejemplo, la versión 2.4.0 se lanzó el 2 de noviembre de 2018 y se mantuvo durante 31 meses hasta que se lanzó la versión 2.4.8 en mayo de 2021. La versión 2.4.8 es la última versión y no se deben esperar más versiones 2.4.x ni siquiera para corregir errores. [47]
MLlib en R: SparkR ahora ofrece APIs MLlib [..] Python: PySpark ahora ofrece muchos más algoritmos MLlib"
Le recomendamos encarecidamente que cambie a Dataset, que tiene un mejor rendimiento que RDD
prácticamente todo el código Spark que ejecuta, ya sean DataFrames o Datasets, se compila en un RDD[ enlace muerto permanente ]
reutilizar los mismos agregados que escribimos para nuestra aplicación por lotes en un flujo de datos en tiempo real
addedMessages(), son las piedras angulares del procesamiento de gráficos en GraphX. ... los algoritmos que requieren más flexibilidad para la condición de terminación deben implementarse utilizando addedMessages()