stringtranslate.com

Apache Spark

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.

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 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 .

Núcleo de chispa

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

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")

Transmisión de chispa

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]

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 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:

GraficoX

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]

Soporte de idiomas

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.

Historia

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 de Scala

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]

Desarrolladores

Apache Spark es desarrollado por una comunidad. El proyecto está gestionado por un grupo llamado "Comité de Gestión de Proyectos" (PMC). [46]

Versiones de mantenimiento y EOL

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]

Véase también

Notas

  1. ^ Se denominaban SchemaRDDs antes de Spark 1.3 [18]

Referencias

  1. ^ "Spark Release 2.0.0". MLlib en R: SparkR ahora ofrece APIs MLlib [..] Python: PySpark ahora ofrece muchos más algoritmos MLlib"
  2. ^ abcd 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).
  3. ^ "Inicio rápido de Spark 2.2.0". apache.org . 2017-07-11 . Consultado el 2017-10-19 . Le recomendamos encarecidamente que cambie a Dataset, que tiene un mejor rendimiento que RDD
  4. ^ "Lista de desuso de Spark 2.2.0". apache.org . 2017-07-11 . Consultado el 2017-10-10 .
  5. ^ Damji, Jules (14 de julio de 2016). "Una historia de tres API de Apache Spark: RDD, DataFrames y conjuntos de datos: cuándo utilizarlas y por qué". databricks.com . Consultado el 19 de octubre de 2017 .
  6. ^ Chambers, Bill (10 de agosto de 2017). "12". Spark: The Definitive Guide . O'Reilly Media . prácticamente todo el código Spark que ejecuta, ya sean DataFrames o Datasets, se compila en un RDD[ enlace muerto permanente ]
  7. ^ "¿Qué es Apache Spark? Guía tutorial de Spark para principiantes". janbasktraining.com . 2018-04-13 . Consultado el 2018-04-13 .
  8. ^ 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 computación en clúster en memoria (PDF) . USENIX Symp. Diseño e implementación de sistemas en red.
  9. ^ Xin, Reynold; Rosen, Josh; Zaharia, Matei; Franklin, Michael; Shenker, Scott; Stoica, Ion (junio de 2013). Shark: SQL y análisis enriquecido a escala (PDF) . SIGMOD 2013. arXiv : 1211.6176 . Código Bibliográfico :2012arXiv1211.6176X.
  10. ^ Harris, Derrick (28 de junio de 2014). «4 razones por las que Spark podría impulsar a Hadoop al máximo». Gigaom . Archivado desde el original el 24 de octubre de 2017. Consultado el 25 de febrero de 2016 .
  11. ^ "Descripción general del modo de clúster - Documentación de Spark 2.4.0 - Tipos de administradores de clúster". apache.org . Apache Foundation. 2019-07-09 . Consultado el 2019-07-09 .
  12. ^ Figura que muestra Spark en relación con otros proyectos de software de código abierto, incluido Hadoop
  13. ^ Matriz de soporte del ecosistema MapR
  14. ^ Doan, DuyHai (10 de septiembre de 2014). "Re: cassandra + spark / pyspark". Usuario de Cassandra (lista de correo) . Consultado el 21 de noviembre de 2014 .
  15. ^ 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.S2CID11157612  .​
  16. ^ ab dotnet/spark, .NET Platform, 14 de septiembre de 2020 , consultado el 14 de septiembre de 2020
  17. ^ "GitHub - DFDX/Spark.jl: enlace de Julia para Apache Spark". GitHub . 2019-05-24.
  18. ^ "Lanzamiento de Spark 1.3.0 | Apache Spark".
  19. ^ "Aplicación de la arquitectura Lambda con Spark, Kafka y Cassandra | Pluralsight". www.pluralsight.com . Consultado el 20 de noviembre de 2016 .
  20. ^ Shapira, Gwen (29 de agosto de 2014). "Building Lambda Architecture with 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
  21. ^ 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). "Evaluación comparativa de motores de computación de transmisión: Storm, Flink y Spark Streaming". Talleres del Simposio Internacional de Procesamiento Distribuido y Paralelo (IPDPSW) del IEEE de 2016. IEEE. págs. 1789–1792. doi :10.1109/IPDPSW.2016.138. ISBN . 978-1-5090-3682-0. Número de identificación del sujeto  2180634.
  22. ^ Kharbanda, Arush (17 de marzo de 2015). "Getting Data into 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 .
  23. ^ Zaharia, Matei (28 de julio de 2016). "Structured Streaming In Apache Spark: A new high-level API for streaming" (Transmisión estructurada en Apache Spark: una nueva API de alto nivel para la transmisión). databricks.com . Consultado el 19 de octubre de 2017 .
  24. ^ "Almacenes de datos locales frente a almacenes de datos en la nube: ventajas y desventajas". SearchDataManagement . Consultado el 16 de octubre de 2022 .
  25. ^ Sparks, Evan; Talwalkar, Ameet (6 de agosto de 2013). "Spark Meetup: MLbase, Distributed Machine Learning with Spark". slideshare.net . Spark User Meetup, San Francisco, California . Consultado el 10 de febrero de 2014 .
  26. ^ "MLlib | Apache Spark". spark.apache.org . Consultado el 18 de enero de 2016 .
  27. ^ Malak, Michael (14 de junio de 2016). "Cómo encontrar isomorfismos de grafos en GraphX ​​y GraphFrames: procesamiento de grafos frente a bases de datos de grafos". slideshare.net . sparksummit.org . Consultado el 11 de julio de 2016 .
  28. ^ Malak, Michael (1 de julio de 2016). Spark GraphX ​​en acción. Manning. pág. 89. ISBN 9781617292521Pregel y su hermano pequeño , 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()
  29. ^ Malak, Michael (14 de junio de 2016). "Cómo encontrar isomorfismos de grafos en GraphX ​​y GraphFrames: procesamiento de grafos frente a bases de datos de grafos". slideshare.net . sparksummit.org . Consultado el 11 de julio de 2016 .
  30. ^ Gonzalez, 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) . OSDI 2014.
  31. ^ ".NET para Apache Spark | Análisis de big data". 15 de octubre de 2019.
  32. ^ "Spark.jl". GitHub . 14 de octubre de 2021.
  33. ^ ab Clark, Lindsay. "Apache Spark acelera la toma de decisiones en el ámbito de los macrodatos". ComputerWeekly.com . Consultado el 16 de mayo de 2018 .
  34. ^ "La Apache Software Foundation anuncia Apache® Spark® como un proyecto de alto nivel". apache.org . Apache Software Foundation. 27 de febrero de 2014 . Consultado el 4 de marzo de 2014 .
  35. ^ Spark establece oficialmente un nuevo récord en clasificación a gran escala
  36. ^ Actividad de desarrollo de Spark en Open HUB
  37. ^ "La Apache Software Foundation anuncia Apache® Spark® como un proyecto de alto nivel". apache.org . Apache Software Foundation. 27 de febrero de 2014 . Consultado el 4 de marzo de 2014 .
  38. ^ "Lanzamiento de Spark 2.4.8". spark.apache.org . Archivado desde el original el 25 de agosto de 2021.
  39. ^ "Lanzamiento de Spark 3.0.3". spark.apache.org .
  40. ^ "Lanzamiento de Spark 3.1.3". spark.apache.org . Archivado desde el original el 18 de junio de 2022.
  41. ^ "Lanzamiento de Spark 3.2.4". spark.apache.org .
  42. ^ "Lanzamiento de Spark 3.3.3". spark.apache.org .
  43. ^ "Lanzamiento de Spark 3.4.3". spark.apache.org .
  44. ^ "Lanzamiento de Spark 3.5.2". spark.apache.org .
  45. ^ "Uso de Scala 3 con Spark". 47 Degrees . Consultado el 29 de julio de 2022 .
  46. ^ "Información del Comité Apache".
  47. ^ "Política de versiones". spark.apache.org .

Enlaces externos