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 completos con paralelismo de datos implícito y tolerancia a fallas . Originalmente desarrollado en la Universidad de California, Berkeley 's AMPLab , la Chispa base de código más tarde fue donada a la Apache Software Foundation , que ha mantenido desde entonces.
Autor (es) original (es) | Matei Zaharia |
---|---|
Desarrollador (es) | Apache Spark |
Versión inicial | 26 de mayo de 2014 |
Lanzamiento estable | 3.1.1 / 2 de marzo de 2021 |
Repositorio | Repositorio Spark |
Escrito en | Scala [1] |
Sistema operativo | Microsoft Windows , macOS , Linux |
Disponible en | Scala , Java , SQL , Python , R , C # , F # |
Tipo | Análisis de datos, algoritmos de aprendizaje automático |
Licencia | Licencia Apache 2.0 |
Sitio web | chispa |
Descripción general
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 grupo de máquinas, que se mantiene de manera tolerante a fallas . [2] La API de Dataframe se lanzó como una abstracción sobre el RDD, seguida de la API de 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 recomienda el uso de la API de Dataset [3] , aunque la API de RDD no está obsoleta . [4] [5] La tecnología RDD todavía es la base de la API de conjunto de datos. [6] [7]
Spark y sus RDD se desarrollaron en 2012 en respuesta a las limitaciones del paradigma de computación en clúster de MapReduce , que fuerza una estructura de flujo de datos lineal particular en programas distribuidos: los programas MapReduce leen datos de entrada del disco, asignan una función a través de los datos, reducen los resultados de la map y almacenar 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]
Spark facilita la implementación de ambos algoritmos iterativos , que visitan su conjunto de datos varias veces en un ciclo, y el análisis de datos interactivo / exploratorio, es decir, la consulta de datos repetida al estilo de una base de datos. La latencia de tales aplicaciones puede reducirse 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 ímpetu inicial para desarrollar Apache Spark. [10]
Apache Spark requiere un administrador de clústeres y un sistema de almacenamiento distribuido . Para la gestión de clusters, soportes de chispa independiente (grupo Spark nativa, donde se puede lanzar un racimo de forma manual o utilizar los scripts de lanzamiento proporcionadas por el paquete de instalación. También es posible ejecutar estos demonios en una sola máquina para probar), Hadoop HILO , Apache Mesos o Kubernetes . [11] Para almacenamiento distribuido, Spark puede interactuar con una amplia variedad, incluyendo Alluxio , Hadoop Distributed File System (HDFS) , [12] MapR File System (MapR-FS) , [13] Cassandra , [14] OpenStack Swift , Amazon Se puede implementar el sistema de archivos S3 , Kudu , Lustre , [15] o una solución personalizada. Spark también admite un modo local pseudodistribuido, que generalmente se usa solo con fines de desarrollo o prueba, donde no se requiere almacenamiento distribuido y en su lugar se puede usar el sistema de archivos local; en tal escenario, Spark se ejecuta en una sola máquina con un ejecutor por núcleo de CPU .
Spark Core
Spark Core es la base del proyecto general. Proporciona despacho de tareas distribuidas, programación y funcionalidades de E / S básicas , 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 de RDD (la API de Java está disponible para otros Lenguajes JVM, pero también se puede utilizar para algunos 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 mapear, filtrar o reducir 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 las uniones , toman RDD como entrada y producen nuevos RDD. Los RDD son inmutables y sus operaciones son perezosas ; La tolerancia a fallos se logra al realizar un seguimiento 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 difusió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 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 mapa , flatMap (una variante de mapa ) 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 de chispa val sc = new SparkContext ( conf ) // Crea un contexto de chispa val data = sc . textFile ( "/ ruta / a / somedir" ) // Leer archivos de "somedir" en un RDD de pares (nombre de archivo, contenido). val tokens = datos . flatMap ( _ . split ( "" )) // Divide cada archivo en una lista de tokens (palabras). val wordFreq = tokens . mapa (( _ , 1 )). reduceByKey ( _ + _ ) // Agrega un recuento de uno a cada token, luego suma los recuentos por tipo de palabra. wordFreq . sortBy ( s => - s . _2 ). mapa ( x => ( x . _2 , x . _1 )). top ( 10 ) // Obtén las 10 palabras principales. Intercambie palabra y cuente para ordenar por conteo.
Spark SQL
Spark SQL es un componente en la parte superior de 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 proporciona compatibilidad con el lenguaje SQL, con interfaces de línea de comandos y servidor ODBC / JDBC . Aunque DataFrames carece de la verificación de tipo en tiempo de compilación que ofrecen los RDD, a partir de Spark 2.0, el DataSet fuertemente tipado también es totalmente compatible con Spark SQL.
import org.apache.spark.sql.SparkSessionval url = "jdbc: mysql: // yourIP: yourPort / test? user = yourUsername; password = yourPassword" // URL para su servidor de base de datos. val chispa = SparkSession . constructor (). getOrCreate () // Crea un objeto de sesión de Sparkval df = chispa . leer . formato ( "jdbc" ) . opción ( "url" , url ) . opción ( "dbtable" , "personas" ) . cargar ()df . printSchema () // Busca el esquema de este DataFrame. val countByAge = gl . groupBy ( "edad" ). count () // Cuenta personas por edad// o alternativamente a través de SQL: //df.createOrReplaceTempView("people ") // val countByAge = spark.sql (" SELECT age, count (*) FROM people GROUP BY age ")
Spark Streaming
Spark Streaming utiliza la capacidad de programación rápida de Spark Core para realizar análisis de transmisión . Ingesta datos en mini lotes y realiza transformaciones RDD en esos mini lotes de datos. Este diseño permite utilizar el mismo conjunto de código de aplicación escrito para análisis por lotes en análisis de transmisión, lo que facilita la implementación de la arquitectura lambda . [19] [20] Sin embargo, esta conveniencia viene con la penalización de latencia igual a la duración del mini-lote. Otros motores de transmisión de datos que procesan evento por evento en lugar de mini lotes incluyen Storm y el componente de transmisión de Flink . [21] Spark Streaming tiene soporte integrado para consumir de 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 .
Biblioteca de aprendizaje automático MLlib
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 comparativas realizadas 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 . [24] Se han implementado muchos algoritmos estadísticos y de aprendizaje automático comunes y se envían con MLlib, que simplifica las canalizaciones de aprendizaje automático a gran escala , que incluyen:
- estadísticas resumidas , correlaciones , muestreo estratificado , prueba de hipótesis , generación de datos aleatorios [25]
- de clasificación y regresión : máquinas de vectores soporte , regresión logística , regresión lineal , la clasificación de Bayes ingenuo , Árbol de decisiones , Random Forest , árbol Impulsado-Gradiente
- técnicas de filtrado colaborativo que incluyen mínimos cuadrados alternos (ALS)
- métodos de análisis de conglomerados que incluyen k-medias y asignación de Dirichlet latente (LDA)
- técnicas de reducción de dimensionalidad como la descomposición de valor singular (SVD) y el análisis de componentes principales (PCA)
- extracción de características y de transformación de las funciones
- algoritmos de optimización como descenso de gradiente estocástico , BFGS de memoria limitada (L-BFGS)
GraphX
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 deben actualizarse, y mucho menos de una manera transaccional como una base de datos de gráficos . [26] GraphX proporciona dos API independientes para la implementación de algoritmos masivamente paralelos (como PageRank ): una abstracción Pregel y una API de estilo MapReduce más general. [27] A diferencia de su predecesor Bagel, que fue formalmente obsoleto en Spark 1.6, GraphX tiene soporte completo para gráficos de propiedades (gráficos donde las propiedades se pueden adjuntar a bordes y vértices). [28]
GraphX puede verse como la versión Spark en memoria de Apache Giraph , que utilizó MapReduce basado en disco de Hadoop. [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 Apache Software Foundation y al proyecto Spark. [30]
Ayuda de idioma
Apache Spark tiene soporte integrado para Scala, Java, R y Python con soporte de terceros para los lenguajes .net, [31] Julia, [32] y más.
Historia
Spark fue iniciado inicialmente por Matei Zaharia en AMPLab de UC Berkeley en 2009, y de código abierto en 2010 bajo una licencia BSD . [33]
En 2013, el proyecto fue donado a 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 contribuyentes en 2015, [36] lo que lo convierte en uno de los proyectos más activos de 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 | Ultima versión | Fecha de lanzamiento |
---|---|---|---|
0,5 | 2012-06-12 | 0.5.1 | 2012-10-07 |
0,6 | 2012-10-14 | 0.6.2 | 2013-02-07 |
0,7 | 2013-02-27 | 0.7.3 | 2013-07-16 |
0,8 | 2013-09-25 | 0.8.1 | 2013-12-19 |
0,9 | 2014-02-02 | 0.9.2 | 2014-07-23 |
1.0 | 2014-05-26 | 1.0.2 | 2014-08-05 |
1.1 | 2014-09-11 | 1.1.1 | 2014-11-26 |
1.2 | 2014-12-18 | 1.2.2 | 2015-04-17 |
1.3 | 2015-03-13 | 1.3.1 | 2015-04-17 |
1.4 | 2015-06-11 | 1.4.1 | 2015-07-15 |
1,5 | 2015-09-09 | 1.5.2 | 2015-11-09 |
1,6 | 2016-01-04 | 1.6.3 | 2016-11-07 |
2.0 | 2016-07-26 | 2.0.2 | 2016-11-14 |
2.1 | 2016-12-28 | 2.1.3 | 2018-06-26 |
2.2 | 2017-07-11 | 2.2.3 | 2019-01-11 |
2.3 | 2018-02-28 | 2.3.4 | 2019-09-09 |
2,4 LTS | 2018-11-02 | 2.4.7 | 2020-10-12 [38] |
3,0 | 2020-06-18 | 3.0.2 | 2020-02-19 [39] |
3.1 | 2021-03-02 | 3.1.1 | 02/03/2021 [40] |
Leyenda: Versión antigua Versión anterior, aún mantenida Ultima versión Última versión de vista previa |
Desarrolladores
Apache Spark es desarrollado por una comunidad. El proyecto es administrado por un grupo llamado "Comité de Gestión de Proyectos" (PMC). El PMC actual es Aaron Davidson, Andy Konwinski, Andrew Or, Ankur Dave, Robert Joseph Evans, DB Tsai, Dongjoon Hyun, Felix Cheung, Hyukjin Kwon, Haoyuan Li, Ram Sriharsha, Holden Karau , Herman van Hövell, Imran Rashid, Jason Dai , Joseph Kurata Bradley, Joseph E. Gonzalez, Josh Rosen, Jerry Shao, Kay Ousterhout, Cheng Lian, Xiao Li, Mark Hamstra, Michael Armbrust, Matei Zaharia , Xiangrui Meng, Nicholas Pentreath, Mosharaf Chowdhury, Mridul Muralidharan, Prashant Sharma, Patrick Wendell, Reynold Xin, Ryan LeCompte, Shane Huang, Shivaram Venkataraman, Sean McNamara, Sean R. Owen, Stephen Haberman, Tathagata Das, Thomas Graves, Thomas Dudziak, Takuya Ueshin, Marcelo Masiero Vanzin, Wenchen Fan, Charles Reiss, Andrew Xia, Yin Huai, Yanbo Liang, Shixiong Zhu. [41]
Ver también
- Lista de marcos / API de programación paralela y simultánea
Notas
- ^ Llamado SchemaRDDs antes de Spark 1.3 [18]
Referencias
- ^ "Spark Release 2.0.0" .
MLlib en R: SparkR ahora ofrece API de MLlib [..] Python: PySpark ahora ofrece muchos más algoritmos MLlib "
- ^ a b c d Zaharia, Matei; Chowdhury, Mosharaf; Franklin, Michael J .; Shenker, Scott; Stoica, Ion. Spark: Computación en clúster con conjuntos de trabajo (PDF) . Taller de USENIX sobre temas de actualidad en computación en la nube (HotCloud).
- ^ "Inicio rápido de Spark 2.2.0" . apache.org . 2017-07-11 . Consultado el 19 de octubre de 2017 .
le recomendamos encarecidamente que cambie para usar Dataset, que tiene un mejor rendimiento que RDD
- ^ "Lista de obsolescencia de Spark 2.2.0" . apache.org . 2017-07-11 . Consultado el 10 de octubre de 2017 .
- ^ Damji, Jules (14 de julio de 2016). "Una historia de tres API de Apache Spark: RDD, DataFrames y conjuntos de datos: cuándo usarlos y por qué" . databricks.com . Consultado el 19 de octubre de 2017 .
- ^ Chambers, Proyecto de ley (10 de agosto de 2017). "12" . Spark: la guía definitiva . O'Reilly Media .
prácticamente todo el código Spark que ejecuta, donde DataFrames o Datasets, se compila en un RDD
- ^ "¿Qué es Apache Spark? Guía tutorial de Spark para principiantes" . janbasktraining.com . 2018-04-13 . Consultado el 13 de abril de 2018 .
- ^ Zaharia, Matei; Chowdhury, Mosharaf; Das, Tathagata; Dave, Ankur; Ma, Justin; McCauley, Murphy; J., Michael; Shenker, Scott; Stoica, Ion (2010). Conjuntos de datos distribuidos resilientes: una abstracción tolerante a fallas para la computación en clúster en memoria (PDF) . USENIX Symp. Diseño e implementación de sistemas en red.
- ^ Xin, Reynold; Rosen, Josh; Zaharia, Matei; Franklin, Michael; Shenker, Scott; Stoica, Ion (junio de 2013). "Shark: SQL y análisis enriquecido a escala" (PDF) . arXiv : 1211.6176 . Código bibliográfico : 2012arXiv1211.6176X . Parámetro desconocido
|conference=
ignorado ( ayuda );Cite journal requiere|journal=
( ayuda ) - ^ Harris, Derrick (28 de junio de 2014). "4 razones por las que Spark podría impulsar a Hadoop a hiperimpulso" . Gigaom .
- ^ "Descripción general del modo de clúster - Documentación de Spark 2.4.0 - Tipos de administrador de clúster" . apache.org . Fundación Apache. 2019-07-09 . Consultado el 9 de julio de 2019 .
- ^ Figura que muestra Spark en relación con otros proyectos de software de código abierto, incluido Hadoop
- ^ Matriz de soporte del ecosistema MapR
- ^ Doan, DuyHai (10 de septiembre de 2014). "Re: cassandra + chispa / pyspark" . Usuario de Cassandra (lista de correo) . Consultado el 21 de noviembre de 2014 .
- ^ Wang, Yandong; Goldstone, Robin; Yu, Weikuan; Wang, Teng (mayo de 2014). "Caracterización y optimización de MapReduce residente en memoria en sistemas HPC". 2014 IEEE 28th International Parallel and Distributed Processing Symposium . IEEE. págs. 799–808. doi : 10.1109 / IPDPS.2014.87 . ISBN 978-1-4799-3800-1. S2CID 11157612 .
- ^ a b dotnet / spark , .NET Platform, 2020-09-14 , consultado 2020-09-14
- ^ "GitHub - DFDX / Spark.jl: enlace de Julia para Apache Spark" . 2019-05-24.
- ^ "Spark Release 1.3.0 | Apache Spark" .
- ^ "Aplicación de la arquitectura Lambda con Spark, Kafka y Cassandra | Pluralsight" . www.pluralsight.com . Consultado el 20 de noviembre de 2016 .
- ^ Shapira, Gwen (29 de agosto de 2014). "Construcción de arquitectura Lambda con Spark Streaming" . cloudera.com . Cloudera. Archivado desde el original el 14 de junio de 2016 . Consultado el 17 de junio de 2016 .
reutilizar los mismos agregados que escribimos para nuestra aplicación por lotes en un flujo de datos en tiempo real
- ^ Chintapalli, Sanket; Dagit, Derek; Evans, Bobby; Farivar, Reza; Graves, Thomas; Holderbaugh, Mark; Liu, Zhuo; Nusbaum, Kyle; Patil, Kishorkumar; Peng, Boyang Jerry; Poulosky, Paul (mayo de 2016). "Benchmarking Streaming Computation Engines: Storm, Flink y Spark Streaming". Talleres del Simposio Internacional de Procesamiento Distribuido y Paralelo del IEEE 2016 (IPDPSW) . IEEE. págs. 1789-1792. doi : 10.1109 / IPDPSW.2016.138 . ISBN 978-1-5090-3682-0. S2CID 2180634 .
- ^ Kharbanda, Arush (17 de marzo de 2015). "Introducir datos en Spark Streaming" . sigmoid.com . Sigmoid (empresa de productos de TI de Sunnyvale, California). Archivado desde el original el 15 de agosto de 2016 . Consultado el 7 de julio de 2016 .
- ^ Zaharia, Matei (28 de julio de 2016). "Streaming estructurado en Apache Spark: una nueva API de alto nivel para streaming" . databricks.com . Consultado el 19 de octubre de 2017 .
- ^ Chispas, Evan; Talwalkar, Ameet (6 de agosto de 2013). "Spark Meetup: MLbase, aprendizaje automático distribuido con Spark" . slideshare.net . Reunión de usuarios de Spark, San Francisco, California . Consultado el 10 de febrero de 2014 .
- ^ "MLlib | Apache Spark" . spark.apache.org . Consultado el 18 de enero de 2016 .
- ^ Malak, Michael (14 de junio de 2016). "Encontrar isomorfismos de gráfico en GraphX y GraphFrames: procesamiento de gráficos frente a base de datos de gráficos" . slideshare.net . sparksummit.org . Consultado el 11 de julio de 2016 .
- ^ Malak, Michael (1 de julio de 2016). Spark GraphX en acción . Manning. pag. 89. ISBN 9781617292521.
Pregel y su hermano menor aggregateMessages () 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 usando aggregateMessages ()
- ^ Malak, Michael (14 de junio de 2016). "Encontrar isomorfismos de gráfico en GraphX y GraphFrames: procesamiento de gráficos frente a base de datos de gráficos" . slideshare.net . sparksummit.org . Consultado el 11 de julio de 2016 .
- ^ Malak, Michael (1 de julio de 2016). Spark GraphX en acción . Manning. pag. 9. ISBN 9781617292521.
Giraph está limitado a ralentizar Hadoop Map / Reduce
- ^ González, Joseph; Xin, Reynold; Dave, Ankur; Crankshaw, Daniel; Franklin, Michael; Stoica, Ion (octubre de 2014). "GraphX: procesamiento de gráficos en un marco de flujo de datos distribuido" (PDF) . Parámetro desconocido
|conference=
ignorado ( ayuda );Cite journal requiere|journal=
( ayuda ) - ^ [1]
- ^ [2]
- ^ a b Clark, Lindsay. "Apache Spark acelera la toma de decisiones de big data" . ComputerWeekly.com . Consultado el 16 de mayo de 2018 .
- ^ "La Apache Software Foundation anuncia Apache & # 8482 Spark & # 8482 como un proyecto de nivel superior" . apache.org . Fundación de software Apache. 27 de febrero de 2014 . Consultado el 4 de marzo de 2014 .
- ^ Spark establece oficialmente un nuevo récord en clasificación a gran escala
- ^ Actividad de desarrollo Open HUB Spark
- ^ "La Apache Software Foundation anuncia Apache & # 8482 Spark & # 8482 como un proyecto de nivel superior" . apache.org . Fundación de software Apache. 27 de febrero de 2014 . Consultado el 4 de marzo de 2014 .
- ^ "Spark News" . apache.org .
- ^ "Spark News" . apache.org .
- ^ "Spark News" . apache.org .
- ^ https://projects.apache.org/committee.html?spark
enlaces externos
- Página web oficial