Apache Spark

De Viquipèdia
Salta a la navegació Salta a la cerca
Crystal Clear app winprops bw.pngApache Spark
Apache Spark logo.svg Modifica el valor a Wikidata

Tipusframework, machine learning framework (en) Tradueix, informàtica en núvol i programari lliure Modifica el valor a Wikidata
Versió inicial30 maig 2014 i 1r març 2014 Modifica el valor a Wikidata
Versió estable
3.1.0 (5 gener 2021) Modifica el valor a Wikidata
LlicènciaLlicència Apache, versió 2.0
Llicència Apache, versió 2.0 Modifica el valor a Wikidata
Característiques tècniques
Sistema operatiuMicrosoft Windows, Linux i macOS Modifica el valor a Wikidata
PlataformaMàquina Virtual Java Modifica el valor a Wikidata
Escrit enScala, Java, Python, R, SQL i Java Database Connectivity Modifica el valor a Wikidata
Format d'arxiu de lectura
Format d'arxiu d'escriptura
Equip
Creador/sMatei Zaharia Modifica el valor a Wikidata
Desenvolupador(s)Apache Software Foundation Modifica el valor a Wikidata
Més informació
Stack ExchangeEtiqueta Modifica el valor a Wikidata
Seguiment d'errorsSeguiment d'errors Modifica el valor a Wikidata

Fig. 1 Estructura interna de l'Apache Spark

Apache Spark és una plataforma de codi obert orientat a l'analítica i processat de dades massives. Ofereix una interfície per a treballar amb clústers tot considerant el paral·lelisme de dades i la tolerància a fallades de forma implícita. Originàriament desenvolupat per la Universitat de Califòrnia a Berkeley el 2009, el codi font fou cedit el 2013 a l'Apache Software Foundation, qui el manté des de llavors.[1][2][3]

Visió General[modifica]

L'arquitectura d'Apache Spark està basada en el concepte de RDD (Resilient Distributed Dataset), un conjunt de dades immutable distribuït al voltant d'un clúster.[4] Sobre aquesta idea fonamental, es van anar creant capes d'abstracció per a facilitar les tasques de programació i control, utilitzant per exemple el concepte de dataset (joc de dades). Així doncs, com a API es recomana la interfície orientada a datasets des de la versió Spark 2.x[5] malgrat que la orientada a RDD segueix existint.[6][7]

El concepte de RDD neix com a contraposició al paradigma MapReduce, una estratègia per lidiar amb grans volums de dades consistent a llegir dades del disc, mapejar-les seguint una funció, reduir-ne els resultats obtinguts i emmagatzemar-los de nou al disc. Malgrat l'enfocament és molt adient (i àmpliament utilitzat) per a multitud de contextos, n'hi ha d'altres en que mostra limitacions, com ara quan prima la velocitat de processament o quan el processat és iteratiu (es processa el mateix conjunt una vegada i una altra). En comptes d'emmagatzemar cada resultat al disc, els RDDs es guarden en memòria compartida, la qual cosa n'optimitza l'accés i disponibilitat.[8]

Els escenaris en que el tractament amb RDDs són beneficiosos, ha donat lloc a nous avantatges i ha permès millorar en el tractament de certs problemes. Són casos ideals per a treballar amb Spark: l'anàlisi exploratori d'un conjunt de dades, les consultes estil SQL o els processos d'aprenentatge automàtic, fent ús de la capacitat iterativa de càlcul.[9][10]

Apache Spark necessitarà en qualsevol cas coordinar-se amb el clúster de maquinari sobre el que treballi. Per a aquesta finalitat, Spark suporta Hadoop YARN, Apache Mesos or Kubernetes,[11] així com una versió pròpia o standalone que sol usar-se per a fer proves.[12]

També necessitarà poder emmagatzemar dades de forma distribuïda. En aquest cas, podria integrar-se amb gairebé qualsevol de les solucions actualment disponibles al mercat, incloent Hadoop Distributed File System (HDFS)[13] o Cassandra.[14] Igual que en el cas del gestor, per a escenaris preliminars de proves, existeix una versió senzilla que no necessita cap complement; simplement un entorn local que simularia el clúster.

Components[modifica]

Nucli[modifica]

El codi font d'Spark està codificat mitjançant el llenguatge de programació Scala i està centrat en la idea dels RDDs immutables. Té APIs per a Scala, Java, .NET, Python i R.

Un exemple típic d'aplicació centrada en l'ús d'RDDs podria ser el següent extracte, que computa la freqüència d'aparició de les paraules que apareixen en una sèrie de fitxers de text i en retorna les més comunes. Es pot observar que els conceptes clau de MapReduce són presents en la lógica d'Spark (funcions map, flatMap o reduceByKey); la diferència és a nivell d'implementació, doncs cada funció genera un nou RDD en base a l'RDD anterior.

val conf = new SparkConf().setAppName("wiki_test") // crea un objecte configuració.
val sc = new SparkContext(conf) // crea un context Spark.
val data = sc.textFile("/cami/al/directori") // Llegeix els fitxers de la carpeta "directori" i els transforma en un primer RDD.
val tokens = data.flatMap(_.split(" ")) // Divideix cada fitxer en totes les seves paraules.
val wordFreq = tokens.map((_, 1)).reduceByKey(_ + _) // Afegeix un 1 a cada paraula, després suma agrupant per paraula.
wordFreq.sortBy(s => -s._2).map(x => (x._2, x._1)).top(10) // Recupera les 10 paraules amb major puntuació i ordena de forma decreixent.

Spark SQL[modifica]

Apache Spark SQL és un mòdul complementari idealment dissenyat per a treballar en contextos en que les dades són estructurades o semi-estructurades i es desitja consultar-les seguint l'estil SQL. Proporciona una capa d'abstracció que de cara a l'usuari difumina les diferències entre treballar sobre RDDs o sobre taules relaciones clàssiques.[15]

L'exemple mostra un cas senzill en que es crea un dataframe a partir d'una taula d'una base de dades i després s'hi executen consultes de tipus SQL.

import org.apache.spark.sql.SparkSession

val url = "jdbc:mysql://yourIP:yourPort/test?user=yourUsername;password=yourPassword" // URL a la base de dades.
val spark = SparkSession.builder().getOrCreate() // Crea una sessió Spark

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

df.createOrReplaceTempView("poblacio")
val countsByAge = spark.sql("SELECT persona, count(*) FROM poblacio GROUP BY edat")

Spark SQL té llibreries per a Scala, Java, .NET i Python.

Spark Streaming[modifica]

Per a casos en que cal lidiar amb fluxos de dades en temps real, Spark proposa el mòdul Spark Streaming. Les senyals d'entrada s'agrupen en mini-lots, de forma que es puguin aplicar sobre cada un els mateixos tractaments que quan es treballa sobre grans blocs de dades, però de forma infinitament més ràpida, la qual cosa dona la sensació de treballar quasi en temps real. Com a contraposició, altres tecnologies com Storm o Flink, sí que permeten treballar senyal a senyal (autènticament en temps real).

Spark Streaming permet alinear-se amb algunes de les eines de missatgeria més populars, com Kafka, Flume o Twitter, i consumir les dades que aquestes li entreguen.

Per a aquells fluxos que tinguin una aparença estructurada existeix Spark Structured Streaming que, de forma similar al que Apache Spark SQL permetia fer amb els grans conjunts de dades, permet tractar els fluxos com si fossin taules SQL.[16] És possible llavors combinar taules estàtiques (o jocs de dades acotats) amb fluxos continus, tractant aquests segons com si fossin taules en continu creixement. És important en aquests casos definir bé els casos d'unions obertes (outer joins) ja que la banda que equival al flux no està acotada.

Referències[modifica]

  1. «Apache Spark™ - What is Spark» (en anglès). https://databricks.com,+18-02-2020.+[Consulta: 18 febrer 2020].
  2. Pointer, Ian. «What is Apache Spark? The big data platform that crushed Hadoop» (en anglès). https://www.infoworld.com,+13-11-2017.+[Consulta: 18 febrer 2020].
  3. Kovachev, Dilyan. «A Beginner’s Guide to Apache Spark» (en anglès). https://towardsdatascience.com,+20-03-2019.+[Consulta: 18 febrer 2020].
  4. "Spark: Cluster Computing with Working Sets" a USENIX Workshop on Hot Topics in Cloud Computing (HotCloud).  
  5. «Spark 2.2.0 Quick Start». apache.org, 11-07-2017. [Consulta: 19 octubre 2017]. «we highly recommend you to switch to use Dataset, which has better performance than RDD»
  6. «Spark 2.2.0 deprecation list». apache.org, 11-07-2017. [Consulta: 10 octubre 2017].
  7. Damji, Jules. «A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets: When to use them and why». databricks.com, 14-07-2016. [Consulta: 19 octubre 2017].
  8. (2010) "Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing" a USENIX Symp. Networked Systems Design and Implementation.  
  9. «Spark vs. Hadoop MapReduce: Which big data framework to choose» (en anglès). [Consulta: 22 març 2021].
  10. Harris, Derrick. «4 reasons why Spark could jolt Hadoop into hyperdrive». Gigaom, 28-06-2014.
  11. «Cluster Mode Overview - Spark 2.4.0 Documentation - Cluster Manager Types». apache.org. Apache Foundation, 09-07-2019. [Consulta: 9 juliol 2019].
  12. «Spark Standalone Mode - Spark 3.1.1 Documentation». [Consulta: 22 març 2021].
  13. Figure showing Spark in relation to other open-source Software projects including Hadoop
  14. Plantilla:Cite mailing list
  15. «What is Spark SQL?» (en anglès americà). [Consulta: 22 març 2021].
  16. «Structured Streaming Programming Guide - Spark 3.1.1 Documentation». [Consulta: 22 març 2021].

Enllaços externs[modifica]