Apache Spark - Apache Spark

Apache Spark
Logotipo de Spark
Autor (es) original (es) Matei Zaharia
Desarrollador (es) Apache Spark
Versión inicial 26 de mayo de 2014 ; hace 7 años ( 26 de mayo de 2014 )
Lanzamiento estable
3.1.1 / 2 de marzo de 2021 ; hace 7 meses ( 02/03/2021 )
Repositorio Repositorio Spark
Escrito en Scala
Sistema operativo Microsoft Windows , macOS , Linux
Disponible en Scala , Java , SQL , Python , R , C # , F #
Escribe Análisis de datos, algoritmos de aprendizaje automático
Licencia Licencia Apache 2.0
Sitio web chispa .apache .org Edita esto en Wikidata

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.

Visió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 . 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 del conjunto de datos, aunque la API de RDD no está obsoleta . La tecnología RDD todavía es la base de la API de conjunto de datos.

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 .

Dentro de Apache Spark, el flujo de trabajo se gestiona como un gráfico acíclico dirigido (DAG). Los nodos representan RDD, mientras que los bordes representan las operaciones en los RDD.

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

Apache Spark requiere un administrador de clústeres y un sistema de almacenamiento distribuido . Para la gestión de clústeres, Spark admite el modo independiente (clúster de Spark nativo, donde puede iniciar un clúster de forma manual o utilizar los scripts de lanzamiento proporcionados por el paquete de instalación. También es posible ejecutar estos demonios en una sola máquina para realizar pruebas), Hadoop YARN , Apache Mesos o Kubernetes . Para el almacenamiento distribuido, Spark puede interactuar con una amplia variedad, incluidos Alluxio , Hadoop Distributed File System (HDFS) , MapR File System (MapR-FS) , Cassandra , OpenStack Swift , Amazon S3 , Kudu , Lustre file system o una solución personalizada puede ser implementado. 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 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 algunos otros lenguajes que no son JVM que pueden conectarse a la JVM, como Julia ). 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. 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 .

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 del 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") // create a spark config object
val sc = new SparkContext(conf) // Create a spark context
val data = sc.textFile("/path/to/somedir") // Read files from "somedir" into an RDD of (filename, content) pairs.
val tokens = data.flatMap(_.split(" ")) // Split each file into a list of tokens (words).
val wordFreq = tokens.map((_, 1)).reduceByKey(_ + _) // Add a count of one to each token, then sum the counts per word type.
wordFreq.sortBy(s => -s._2).map(x => (x._2, x._1)).top(10) // Get the top 10 words. Swap word and count to sort by count.

Spark SQL

Spark SQL es un componente en la parte superior de Spark Core que introdujo una abstracción de datos llamada DataFrames, 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 . 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.SparkSession

val url = "jdbc:mysql://yourIP:yourPort/test?user=yourUsername;password=yourPassword" // URL for your database server.
val spark = SparkSession.builder().getOrCreate() // Create a Spark session object

val df = spark
  .read
  .format("jdbc")
  .option("url", url)
  .option("dbtable", "people")
  .load()

df.printSchema() // Looks the schema of this DataFrame.
val countsByAge = df.groupBy("age").count() // Counts people by age

//or alternatively via SQL:
//df.createOrReplaceTempView("people")
//val countsByAge = 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 . 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 . Spark Streaming tiene soporte integrado para consumir de Kafka , Flume , Twitter , ZeroMQ , Kinesis y sockets TCP / IP .

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.

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 distribuido de aprendizaje automático 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 . Se han implementado muchos algoritmos estadísticos y de aprendizaje automático comunes que se envían con MLlib, lo que simplifica las canalizaciones de aprendizaje automático a gran escala , que incluyen:

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 . GraphX ​​proporciona dos API independientes para la implementación de algoritmos masivamente paralelos (como PageRank ): una abstracción de Pregel y una API de estilo MapReduce más general. 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).

GraphX ​​puede verse como la versión Spark en memoria de Apache Giraph , que utilizó MapReduce basado en disco de Hadoop.

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.

Ayuda de idioma

Apache Spark tiene soporte integrado para Scala, Java, R y Python con soporte de terceros para .NET CLR, Julia 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 .

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 .

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.

Spark tuvo más de 1000 contribuyentes en 2015, lo que lo convierte en uno de los proyectos más activos de Apache Software Foundation 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
Versión antigua, ya no se mantiene: 0,5 2012-06-12 0.5.1 2012-10-07
Versión antigua, ya no se mantiene: 0,6 2012-10-14 0.6.2 2013-02-07
Versión antigua, ya no se mantiene: 0,7 2013-02-27 0.7.3 2013-07-16
Versión antigua, ya no se mantiene: 0,8 2013-09-25 0.8.1 2013-12-19
Versión antigua, ya no se mantiene: 0,9 2014-02-02 0.9.2 2014-07-23
Versión antigua, ya no se mantiene: 1.0 2014-05-26 1.0.2 2014-08-05
Versión antigua, ya no se mantiene: 1.1 2014-09-11 1.1.1 2014-11-26
Versión antigua, ya no se mantiene: 1.2 2014-12-18 1.2.2 2015-04-17
Versión antigua, ya no se mantiene: 1.3 2015-03-13 1.3.1 2015-04-17
Versión antigua, ya no se mantiene: 1.4 2015-06-11 1.4.1 2015-07-15
Versión antigua, ya no se mantiene: 1,5 2015-09-09 1.5.2 2015-11-09
Versión antigua, ya no se mantiene: 1,6 2016-01-04 1.6.3 2016-11-07
Versión antigua, ya no se mantiene: 2.0 2016-07-26 2.0.2 2016-11-14
Versión antigua, ya no se mantiene: 2.1 2016-12-28 2.1.3 2018-06-26
Versión antigua, ya no se mantiene: 2.2 2017-07-11 2.2.3 2019-01-11
Versión antigua, ya no se mantiene: 2.3 2018-02-28 2.3.4 2019-09-09
Versión anterior, pero aún se mantiene: 2,4 LTS 2018-11-02 2.4.8 2021-05-17
Versión estable actual: 3,0 2020-06-18 3.0.3 2021-06-01
Versión estable actual: 3.1 2021-03-02 3.1.2 2021-06-01
Leyenda:
Versión antigua
Versión anterior, aún mantenida
Ultima versión
Última versión de vista previa
Lanzamiento futuro

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.

Ver también

Notas

Referencias

enlaces externos