Toto je starší verze dokumentu!


MapReduce

Princip:

  • MAP
    • vstupní data ve formátu <KEY1, VALUE1> konvertuje na <KEY2,VALUE2>
  • REDUCE
    • vstupní data ve formátu <KEY2, LIST(VALUE2)> konvertuje na <KEY3,VALUE3>

Mapper

  • Vstupní údaje mapuje na hodnoty typu klíč – hodnota
  • Vstupem je formálně také klíč – hodnota
  • Ale často nás klíč vůbec nezajímá! Je to třeba offset souboru
  • Klíč se může libovolně opakovat, hodnota může být různá
  • Typicky probíhá v mnoha paralelních jobech
    • Každý soubor, resp. split je zpracován samostatným mapperem
  • Výstup se zapisuje na lokální disk

Shuffle & Sort

  • Vstupem jsou vygenerované soubory z mapperů
  • Všechna data se stejným klíčem slije na jeden node
    • Tj. musí data načíst z jednotlivých nodů (disková operace)
    • Ale čte je jen z lokálních disků, nikoli z HDFS
    • A pak musí data přenést (síť)
  • Setřídí data podle klíče (merge)
  • Optimalizace – malá data pošle rovnou do reduceru, velká merguje na lokálním disku
  • Typicky nejnáročnější operace

Reduce

  • Čte produkovaná data pomocí Shuffle & Sort
  • všechny dvojice klíč/hodnota se stejným klíčem jdou do stejného reduceru
  • „Redukuje“ list hodnot čtených z výstupy Shuffle & Sort
  • Zpravidla je reducerů (řádově) méně než mapperů
  • Počet lze definovat, default je 1
  • Každý reducer generuje 1 soubor do HDFS
  • Výstup se nijak nesortuje

Combiner

  • sníží zátěž Shuffle&Sort části
  • Volitelná část zpracování mapperu, provádí reduce na straně mapperu
  • Stejné rozhraní jako Reducer
  • Proč použít combiner
    • data jsou načtena v paměti, ušetří se IO operace – čtení
    • často je výstup menší než vstup, ušetří se IO operace – zápis (a následné čtení)

Partitioner

  • Partitioner rozděluje data do několika partitions
    • podle klíče
    • podle hodnoty
  • MapReduce zajišťuje, že jedna partition je zpracována jedním reducerem
  • Vlastní partitioner lze použít např. v případech, kdy
    • chci znát nějaké specifické rozdělení (např. věkové kategorie)
    • mám velmi nevyvážené klíče (jeden klíč se vyskytuje abnormálně často)
  • klíče jsou z shuffle&sort poslány do partitioneru, který rozhoduje, do kterého reduceru půjde
  • Partitioner je funkce, která hashuje klíč a vezme modulo tohoto hashe a počtu reduceru, aby zjistil, který reducer dostane daný pár klíč-hodnota. jelikož hash jednoho klíče bude pořád stejný, všechny páry klíč-hodnota se stejným klíčem budou poslány do stejného reduceru

Příklady

  • vhodné úlohy
    • počet slov v textu, četnost slov, reporting – načítání řady dílčích výsledků (prodeje), podle klienta, produktu nebo lokality, řazení dat (sortování), filtrování dat, validace
  • nevhodné úlohy
    • průměr, medián - lze přeformulovat

Kdy použít MapReduce › Tam, kde úloha umožňuje paralelizaci – a lze ji převést na úlohu vhodnou pro MapReduce › Při práci se skutečně velkými daty (petabajty) – tak velká data se v paměti nedají uchovávat/zpracovat › Při práci s výpočetně náročnými úlohami, kde se spíše data načítají než zapisují › Když není čas kritický › Stačí dávkové zpracování › Když není dostatek paměti v clusteru

Kdy není vhodný MapReduce › Tam, kde úlohu nelze paralelizovat a převést na MapReduce kompatibilní  › Je-li vyžadována okamžitá reakce – i pro jednoduché úlohy trvá inicializace velmi dlouho › Když je úkol „malý“

kj/mapreduce.1504191219.txt.gz · Poslední úprava: 31.08.2017 16:53 autor: kj

Nástroje pro stránku