Apache Spark: diferència entre les revisions
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
| |
Tipus | entorn de treball, machine learning framework (en) , informàtica al núvol i programari lliure |
---|---|
Versió inicial | 30 maig 2014 i 1r març 2014 |
Versió estable | |
Llicència | Llicència Apache, versió 2.0 llicència BSD |
Característiques tècniques | |
Sistema operatiu | Microsoft Windows, Linux i macOS |
Plataforma | Màquina Virtual Java |
Escrit en | Scala, Java, Python, R, Structured Query Language i Java Database Connectivity |
Format de fitxer de lectura | |
Format de fitxer d'escriptura | |
Equip | |
Creador/s | Matei Zaharia |
Desenvolupador(s) | Apache Software Foundation |
Fonts de codi | |
Més informació | |
Lloc web | spark.apache.org (anglès) |
Stack Exchange | Etiqueta |
Seguiment d'errors | Seguiment d'errors |
| |
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
- ↑ «Apache Spark™ - What is Spark» (en anglès). https://databricks.com,+18-02-2020.+[Consulta: 18 febrer 2020].
- ↑ 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].
- ↑ Kovachev, Dilyan. «A Beginner’s Guide to Apache Spark» (en anglès). https://towardsdatascience.com,+20-03-2019.+[Consulta: 18 febrer 2020].
- ↑ "Spark: Cluster Computing with Working Sets" a USENIX Workshop on Hot Topics in Cloud Computing (HotCloud).
- ↑ «Spark 2.2.0 Quick Start», 11-07-2017. «we highly recommend you to switch to use Dataset, which has better performance than RDD»
- ↑ «Spark 2.2.0 deprecation list», 11-07-2017.
- ↑ Damji, Jules. «A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets: When to use them and why», 14-07-2016.
- ↑ (2010) "Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing" a USENIX Symp. Networked Systems Design and Implementation.
- ↑ «Spark vs. Hadoop MapReduce: Which big data framework to choose» (en anglès). [Consulta: 22 març 2021].
- ↑ Harris, Derrick. «4 reasons why Spark could jolt Hadoop into hyperdrive», 28-06-2014.
- ↑ «Cluster Mode Overview - Spark 2.4.0 Documentation - Cluster Manager Types». Apache Foundation, 09-07-2019.
- ↑ «Spark Standalone Mode - Spark 3.1.1 Documentation». [Consulta: 22 març 2021].
- ↑ Figure showing Spark in relation to other open-source Software projects including Hadoop
- ↑ Plantilla:Cite mailing list
- ↑ «What is Spark SQL?» (en anglès americà). [Consulta: 22 març 2021].
- ↑ «Structured Streaming Programming Guide - Spark 3.1.1 Documentation». [Consulta: 22 març 2021].