Implementujte funkciu double priemer(JavaRDD<Double> data), ktorá dostane RDD kolekciu čísel a vypočíta ich priemer.
Postup
Na výpočet súčtu čísel použite reduce a vhodný lambda výraz
z príkazovoho riadku pomocou skriptu spark-submit
1 |
./bin/spark-submit --class asos.uloha1.MainClass /home/ASOS/uloha1/target/uloha1-1.0.jar |
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.
Pre spustenie pomocou spark-submit je potrebné stiahnuť si inštaláciu sparku „Pre-build for Apache Hadoop 2.7“ zo stránky http://spark.apache.org/downloads.html a rozbaliť si ju. Skript sa nachádza v bin adresári inštalácie.
Alternatívna implementácia
Ak ste na zistenie počtu čísel použili metódu count, čítate vstupnú RDD kolekciu 2x, (pri výpočte súčtu aj počtu čísel). Skúste navrhnúť algoritmu tak aby súčet aj počet čísel dokázal zistiť naraz jediným prečítaním kolekcie. Návod: použite mapToPair, pozri 10. Prednáška, Príklad 3.
Implementujte a otestujte si sami Príklad 2. z Prednášky 10, pričom:
si overte či v argumente textFile možno použiť * (napr. „src/test/csv/*.txt“)
skúste tiež rôzne funkcie pre filter
a akciu sample (namiesto collect)
následne doplňte program tak, aby využitím map a reduce zistil dĺžku najdlhšieho riadku.
Implementujte a otestujte si sami Príklad 3. z Prednášky 10, pričom pri zisťovaní početnosti slov:
ignorujte slová, ktoré obsahujú iné ako alfanumerické znaky. Použite najprv filter
nerozlišujte malé a veľké písmená. Použite najprv map
namiesto reduceByKey a collectAsMap použite priamo countByValue
Pozri: http://spark.apache.org/docs/latest/api/java/org/apache/spark/api/java/JavaPairRDD.html#countByValue
Reiplementujte predchádzajúce úlohy pričom namiesto lambda výrazov použijete ako argumenty transfornácií funkcionálne objekty.
ako sme v 2. úlohe videli, textFile umožňuje načítať po riadkoch aj viac súborov. Stratíme pri tom však informáciu o tom z ktorého súboru boli riadky načítané. Funkcia wholeTextFiles načíta súbory do kolekcie dvojíc reťazcov, kde prva položka dvojice je názov súboru a druhá obsah súboru. Ak chceme rozložiť obsah súboru na riadky alebo slová treba použiť flatMapValues.
Implemetujte program,
ktorý pomocou wholeTextFiles načíta textové súbory zo zadaného adresára do kolekcie dvojíc JavaPairRDD<String, String>
a pomocou flatMapValues(s -> Lists.newArrayList(s.split("\\s+"))) ich rozloží na slová, čím dostanete kolekciu dvojíc, kde prvá položka je názov súboru a druhá slovo.
v kolekcii ponechajte len položky, kde slovo pozostáva len z alfanumerických znakov. Návod, použite filter filter(t-> t._2.matches("\\w+"))
implementujte výpis obsahu, tak že pomocou akcie collect() získate z nej List<Tuple2<String, String>> a následne vypíšete všetky dvojice.
vyskúšajte, čo dostanete, ak namiesto collect použijete pri výpise collectAsMap
implementujte výpis obsahu pomocou forEach
Z kolekcie môžete následne zistiť a vypísať:
koľko slov obsahujú jednotlivé súbory. Použite countByKey
koľko rôznych slov obsahujú jednotlivé súbory. Použite distinct
Pozn. ak pri tom nechcete rozlišovať malé a veľké písmená, skúste najprv konvertovať slová na malé písmená pomocou mapValues
koľkých súboroch sa vyskytujú jednotlivé slová. Návod: pomocou mapMapToPair vytvorte najprv transponovanú PairRDD, (t.j vymeníte prvú a druhú položku dvojíc.)
Pozor aby ste pre dané slovo započítali súbor len raz, aj keď sa v ňom slovo vyskytuje viac krát.
Pozri:
wholeTextFiles http://spark.apache.org/docs/latest/api/java/org/apache/spark/SparkContext.html#wholeTextFiles-java.lang.String-int-
countByKey http://spark.apache.org/docs/latest/api/java/org/apache/spark/api/java/JavaPairRDD.html#countByKey–
countByValue http://spark.apache.org/docs/latest/api/java/org/apache/spark/api/java/JavaPairRDD.html#countByValue–
distinct http://spark.apache.org/docs/latest/api/java/org/apache/spark/api/java/JavaPairRDD.html#distinct–
Pomocou Spark Java API implementujte Príklad 5. 10. prednášky ilustrujúci použitie množinových operácií
Pomocou Spark java API implementujte funkciu linreg, ktorá vypočíta koeficienty regresnej priamky. Pozri Príklad 6. 10. prednášky
Tuple2<Double, Double> linreg ( JavaRDD<Tuple2<Double,Double>> body )
Funkčnosť otestujte dvoma spôsobmi:
V hlavnom programe vytvorte zoznam dvojíc List<Tuple2<Double, Double>> a vložte do neho body pre test (aspoň 3, napr. tie z prednášky).
Vytvorte csv súbor s dvoma stĺpcami obsahujúci súradnice bodov. (Príklad csv súboru je tu.)
Súbor načítajte do RDD<String> pomocou textFile . (Pozri Prednáška 10, Príklad 2.)
Následne pomocou map aplikujte na riadky funkciu, ktorá ich rozdelí na stĺpce a konvertuje na dvojicu čisel – objekt typu Tuple2<Double,Double> .
Výsledný RDD typu Tuple2<Double,Double> použite ako vstup do funkcie linreg.
Návod: Zložky objektu x typu Tupple2 sú prístupne ako x._1 a x._2
Reimplementácia Úlohy 3. z 9. cvičenia v jazyku Scala príp. Python.
Vytvorte si skript (Scala alebo Python) na overovanie prvočísliel pomocou map-reduce a v interaktívnom móde zistite či 231-1 alebo 231+1 je prvočíslo.
Pre prácu v interaktívnom móde je potrebné stiahnuť si inštaláciu sparku „Pre-build for Apache Hadoop 2.7“ zo stránky http://spark.apache.org/downloads.html a rozbaliť si ju a spustiť príslušný interpreter. Pozri https://spark.apache.org/docs/latest/quick-start.html