I-ASOS Prednáška 10

Apache Spark framework

ParallelStream nám umožňuje využiť viacprocesorové počítače. Framework apache Spark umožňuje vykonanie paralelneho algoritmu distribuovať cloud počítacov. Algoritmus nemusí byť dokonca napísaný len v jazyku java. Framework podporuje aj jazyky Python, Scala, a R.

Spark framework poskytuje pre paralelné (funkcionálne) spracovanie dát dve API a ich kolekcie

RDD API poskytuje viacero typov funkcií pre prácu s RDD

  • faktory metódy – slúžia na vytvorenie RDD z iných vstupných dátových zdojov. Napr. paralelize,

  • transformácie – slúžia na transformáciu jedného RDD na iné RDD. Napr. map

  • akcie – slúžia na získanie nedistribuovaných výstupných hodnôt/dát z RDD. Napr. reduce

Prehľad najpoužívanejších

RDD API – Java

  • Maven dependency pre build java aplikácií:

  • Na začiatku Spark programu je potrebné inicializovať Spark-kontext, ktorý poskytuje prístup ku klastru.

    Pozn. argument „local[2]“ nastavuje, že výpočet má bežať na lokálnom počítači paralelne na dvoch výpočtových uzloch (CPU) ak sú k dispozícii.

    Pozri: https://spark.apache.org/docs/latest/rdd-programming-guide.html#initializing-spark

  • Pre podporu paralelných výpočtov poskytuje Spark Java API vlastnú RDD kolekciu – distribuovaný dataset (anlógia Java8 ParallelStreamu). RDD kolekcie môžeme vytvoriť rôznymi spôsobmi. Zo zoznamu ju získame pomocou kontext metódy parallelize.

Príklad 1. – Účty.

Reimplementácia 1. príkladu z predchádzajúcej prednášky pomocou Spark RDD API. Ilustruje:

  • vytvorenie spark konfigurácie a kontextu
  • factory method paralellize na vytvorenie RDD zo zoznamu.

  • transformáciu map

  • akciu reduce

Pozn. všimite si, že pred ukončením aplikácie sa patrí uzavrieť prácu s spark-kontextom



  • Pozn. Namiesto kolekcie Stream použijete RDD kolekciu objektov triedy Ucet. RDD kolekcia však vyžaduje aby objekty, ktoré v nej boli serializovateľné, teda:

Spustiť a otestovať aplikáciu môžete priamo v netbeans alebo z prikazového riadku skriptom spark-submit



  • Spúšťajte aplikáciu na rôznom počte výpočtových uzlov. Tento parameter môžete zadať v kóde v inicializácii kontextu alebo až pri spustení ako voľbu príkazu spark-submit.

    Pozri: https://spark.apache.org/docs/latest/submitting-applications.html.

Príklad 2. – práca s textovým súborom

Java aplikácia ilustrujúca niektoré ďalšie transformácie a akcie:

  • factory method textFile

  • akcia count

  • akcia first

  • akcia collect

  • transformácia filter

  • transformácia flatMap

    Pozn. distFile.map(s -> s.split(“ „)) nefunguje tak ako by sme chceli: vyskúšajte

Príklad 3. – Key value pairs

Ak by sme chceli zistiť koľkokrát sa v súbore vyskytujú jednotlivé slová zrejme by sme vytvorili java.util.map, v ktorej klúčom bude slovo a hodnota je počet.

  • mapValues todo

RDD API – Scala

Spark poskytuje RDD API aj pre ďalšie jazyky ako PythonScala a RScala je interpretovaný funkcionálny jazyk vykonávaný JVM.

Scala-shell

umožňuje rýchlo zvládnuť API a použiť ho pre analýzu dát v interaktívnom mode. Spustenie scala-shellu:

 

 

Príklad 4. – Príklad 3. implementovný v scale

 

 

Príklad 5. – Množinové operácie

  • Máme dva textové súbory (napr. 2 riešenia implementačnej úlohy) a chceme zistiť nakoľko sú si podbobné. Konkretne nás môže zaujímať, nakoľko sú si podobné množiny slov (slovníky) vyskytujúce sa v týchto súboroch.

Ako mieru podobnosti dvoch množín môžeme použiť napr. symetrickú diferenciu. Pre prácu RDD ako množinami poskytuje Spark typické množinové operácie:

  • union
  • intersection
  • subtract
  • distinct
  • cartesian
  • join

 

 

Map-Reduce umožňuje paralelizovať aj zložitejšie výpočty

Príklad 6. Lineárna regresia

  • Vstup: sada usporiadaných dvojíc čísel (bodov v rovine): (xi , yi) pre i=1..n

  • Výstup: koeficienty a, c regresnej priamky y = a +c*x aproximujúcej vstupnú množinu.

Numerické riešenie: Koeficienty možno vyrátať pomocou jednoduchých vzorcov (pozri napr. http://it4kt.cnl.sk/c/nm/lecturer/13.html):

  • c = (n.sxy – sx.sy) / (n.sx2 – sx.sx)

  • a = (sy – c.sx) / n

kde

  • sx = ∑xi

  • sy = ∑yi

  • sxy = ∑xi.yi

  • sx2 = ∑xi.xi

Implementáia riešenia pomocou Spark v jazyku Scala

 

vyýpočty súm môžeme urobiť jediným príkazom

 

Java applikácia – DU