Spark

  • systém pro distribuované výpočty na clusteru
  • vylepšení původního map-reduce, o 2 řády rychlejší
    • zpracování v paměti – méně I/O operací, vhodné pro iterativní algoritmy nebo analýzu dat
    • optimalizace operací před zpracováním
    • nyní i pseudo-SQL příkazy
  • API pro Scalu, Javu, Python a R
  • s Hadoopem (využívá HDFS, YARN) i samostatně

Vhodné úlohy

  • dostatečně velké, ale ne extrémně
  • dobře paralelizovatelné
  • iterační

Nevhodné úlohy

  • příliš malé
  • s extrémními požadavky na paměť
  • šité na míru jiné technologii (SQL, Java)
  • špatně paralelizovatelné
  • real-time

RDD

  • resilient distributed dataset
  • kolekce prvků (např. řádky v textovém souboru, datová matice, posloupnost binárních dat)
  • nedá se přepsat, vytvoří se nové RDD
  • proměnné jsou jen lokální

Akce a transformace

  • transformace - nevrací hodnotu - transformace se plánují a optimalizují, ale zatím neprovádějí
    • map (prvek → transformační funkce → nový prvek)
    • flatMap (prvek → transformační funkce → 0 až N nových prvků)
    • filter, distinct (pustí se jen řádky vyhovující podmínce / unikátní)
    • join (připojí řádky jiného RDD podle hodnot klíče)
    • union, intersection (sjednocení a průnik s jiným RDD)
    • groupByKey, reduceByKey (setřídí / agreguje prvky podle klíče)
  • akce - lazy evaluation: až první akce spustí celý proces
    • reduce (pomocí zadané funkce agreguje všechny prvky RDD)
    • take (vypíše prvních n prvků RDD)
    • count (počet prvků)
    • collect (vypíše RDD jako pole prvků)
    • saveAsTextFile (uloží jako textový soubor)

:!: Akce spustí celý řetězec od začátku!

  • Všechny mezivýsledky se zapomenou.
  • Pokud to nechceme, musíme některé RDD uložit do cache.

Úkol: spočítat četnosti slov v dokumentu

Vstup: textový soubor rozdělený do řádků (RDD)

Postup:

  • transformace řádků: řádek → rozdělení na slova → prvky typu (slovo, 1)
  • seskupení prvků se stejným klíčem a sečtení jedniček
  • Výsledek transformace: RDD s prvky (slovo, četnost)

Data Frame

Datová struktura DataFrame = RDD + sloupcové operace

  • obdoba databázové relační tabulky
  • obsahuje i schéma
  • operace nad rámec RDD – práce se sloupci
  • možnost použití syntaxe podobné SQL

Úkol: který stát USA má na meteostanicích nejvyšší průměrný normál v létě?

Vstup: tabulka Hive

Postup:

  • načtení dat dotazem do Hive
df=sqlContext.sql('select * from sstamenov.pocasi')
  • omezit data na letní měsíce
df2=df.filter((df.mesic>5) & (df.mesic<9))
  • ponechat jen důležité sloupce (+ vyhodit null)
df3=df2.select('stat','teplota').na.drop()
  • seskupit po státech, spočítat průměry (+ přejmenovat sloupec)
df4=df3.groupBy('stat').avg().toDF('stat','prum')
  • seřadit podle průměrů sestupně
df5=df4.sort(df4.prum.desc())
  • omezit na první řádek
df5.limit(1)
kj/spark.txt · Poslední úprava: 18.08.2017 16:18 autor: kj

Nástroje pro stránku