Vés al contingut

Apache Spark: diferència entre les revisions

De la Viquipèdia, l'enciclopèdia lliure
Contingut suprimit Contingut afegit
Restored revision 29770867 by ArnauBot (talk): Ídem
Etiqueta: Desfés
spam
Línia 18: Línia 18:
El codi font d'Spark està codificat mitjançant el [[Scala (llenguatge de programació)|llenguatge de programació Scala]] i està centrat en la idea dels RDDs immutables. Té APIs per a Scala, [[Java (llenguatge de programació)|Java]], [[Microsoft .NET|.NET]], [[Python]] i [[R (llenguatge de programació)|R]].
El codi font d'Spark està codificat mitjançant el [[Scala (llenguatge de programació)|llenguatge de programació Scala]] i està centrat en la idea dels RDDs immutables. Té APIs per a Scala, [[Java (llenguatge de programació)|Java]], [[Microsoft .NET|.NET]], [[Python]] i [[R (llenguatge de programació)|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 {{mono|map}}, {{mono|flatMap}} o {{mono|reduceByKey}}); la diferència és a nivell d'implementació, doncs cada funció genera un nou RDD en base a l'RDD anterior.
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 {{mono|map}}, {{mono|flatMap}} o {{mono|reduceByKey}}); la diferència és a nivell d'implementació, doncs cada funció genera un nou RDD en base a l'RDD anterior.<syntaxhighlight lang="scala" line="1">

http://www.mindqsystems.com/trainings/sql-server-dba-training/<syntaxhighlight lang="scala" line="1">
val conf = new SparkConf().setAppName("wiki_test") // crea un objecte configuració.
val conf = new SparkConf().setAppName("wiki_test") // crea un objecte configuració.
val sc = new SparkContext(conf) // crea un context Spark.
val sc = new SparkContext(conf) // crea un context Spark.
Línia 59: Línia 57:
{{Referències}}
{{Referències}}


== Enllaços externs ==
* [https://tekslate.com/apache-spark-scala-tutorials Apache Spark, a tekslate.com]
[[Categoria:Programari]]
[[Categoria:Programari]]

Revisió del 13:55, 15 set 2022

Apache Spark
Modifica el valor a Wikidata
Modifica el valor a Wikidata
Tipusentorn de treball, machine learning framework (en) Tradueix, informàtica al 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.5.3 (9 setembre 2024) Modifica el valor a Wikidata
LlicènciaLlicència Apache, versió 2.0
llicència BSD 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, Structured Query Language i Java Database Connectivity Modifica el valor a Wikidata
Format de fitxer de lectura
Format de fitxer d'escriptura
Equip
Creador/sMatei Zaharia Modifica el valor a Wikidata
Desenvolupador(s)Apache Software Foundation Modifica el valor a Wikidata
Més informació
Lloc webspark.apache.org (anglès) Modifica el valor a Wikidata
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

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

Nucli

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

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

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

  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», 11-07-2017. «we highly recommend you to switch to use Dataset, which has better performance than RDD»
  6. «Spark 2.2.0 deprecation list», 11-07-2017.
  7. Damji, Jules. «A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets: When to use them and why», 14-07-2016.
  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», 28-06-2014.
  11. «Cluster Mode Overview - Spark 2.4.0 Documentation - Cluster Manager Types». Apache Foundation, 09-07-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].