I-ASOS Cvičenie 10

10. cvičenie

Úloha 1

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

  • Na zistenie počtu čísel, môžete použiť metódu count
  • Pre otestovanie vytvorte aplikácia ktorá
    • inicializuje spark-context
    • inicializuje zoznam čisel pre testovanie a vytvorí s neho RDD kolekciu (pomocou parallelize)
    • vypočíta a vypíše priemer
  • Aplikáciu spustite a testujte
    • v netbeans
    • z príkazovoho riadku pomocou skriptu 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-submitPozri: 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.

Úloha 2.

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.

Úloha 3.

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

Úloha 4. Nepovinná

Reiplementujte predchádzajúce úlohy pričom namiesto lambda výrazov použijete ako argumenty transfornácií funkcionálne objekty.

Úloha 5.

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+")) 

  • vypíšete jej obsah:
    1. 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.

    2. vyskúšajte, čo dostanete, ak namiesto collect použijete pri výpise collectAsMap

    3. 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:

Úloha 6.

Pomocou Spark Java API implementujte Príklad 5. 10. prednášky ilustrujúci použitie množinových operácií

Úloha 7.

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 ) 

  • argument body: je RDD usporiadaných dvojíc koeficientov bodov.
  • návratová hodnota: je usporiadaná dvojica koeficientov regresnej priamky

Funkčnosť otestujte dvoma spôsobmi:

  1. 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).

    • Následne s neho vytvorte RDD (pomocou parallelize) a zavolajte funkciu linreg.
  2. 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

Úloha 8

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