Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Následující verze | Předchozí verze | ||
kj:mapreduce [24.08.2017 12:15] kj vytvořeno |
kj:mapreduce [18.09.2017 15:50] (aktuální) kj |
||
---|---|---|---|
Řádek 4: | Řádek 4: | ||
* MAP | * MAP | ||
* vstupní data ve formátu <KEY1, VALUE1> konvertuje na <KEY2,VALUE2> | * vstupní data ve formátu <KEY1, VALUE1> konvertuje na <KEY2,VALUE2> | ||
+ | * často nás KEY1 nezajímá - může být offset souboru | ||
* REDUCE | * REDUCE | ||
* vstupní data ve formátu <KEY2, LIST(VALUE2)> konvertuje na <KEY3,VALUE3> | * vstupní data ve formátu <KEY2, LIST(VALUE2)> konvertuje na <KEY3,VALUE3> | ||
Řádek 11: | Řádek 12: | ||
Mapper | Mapper | ||
- | * Vstupní údaje mapuje na hodnoty typu klíč – hodnota | + | * vstupní údaje mapuje na hodnoty typu klíč – hodnota |
- | * Vstupem je formálně také klíč – hodnota | + | * vstupem je formálně také klíč – hodnota |
- | * Ale často nás klíč vůbec nezajímá! Je to třeba offset souboru | + | * 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á | + | * klíč se může libovolně opakovat, hodnota může být různá |
- | * Data jsou na konci setříděna podle klíče (zpravidla, ne vždy) | + | |
* Typicky probíhá v mnoha paralelních jobech | * Typicky probíhá v mnoha paralelních jobech | ||
* Každý soubor, resp. split je zpracován samostatným mapperem | * Každý soubor, resp. split je zpracován samostatným mapperem | ||
Řádek 21: | Řádek 21: | ||
Shuffle & Sort | Shuffle & Sort | ||
- | * Vstupem jsou vygenerované soubory z mapperů | + | * vstupem jsou vygenerované soubory z mapperů |
- | * Všechna data se stejným klíčem slije na jeden node | + | * všechna data se stejným klíčem slije na jeden node |
- | * Tj. musí data načíst z jednotlivých nodů (disková operace) | + | * tj. musí data načíst z jednotlivých nodů (disková operace) |
- | * Ale čte je jen z lokálních disků, nikoli z HDFS | + | * 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) |
- | * Setřídí data podle klíče (merge) | + | * optimalizace – malá data pošle rovnou do reduceru, velká merguje na lokálním disku |
- | * Optimalizace – malá data pošle rovnou do reduceru, velká merguje | + | * typicky nejnáročnější operace |
- | na lokálním disku | + | |
- | * Typicky nejnáročnější operace | + | |
Reduce | Reduce | ||
- | * Čte produkovaná pomocí Shuffle & Sort | + | * čte produkovaná data pomocí Shuffle & Sort |
- | * „Redukuje“ list hodnot čtených z výstupy Shuffle & Sort | + | * všechny dvojice klíč/hodnota se stejným klíčem jdou do stejného reduceru |
- | * Zpravidla je reducerů (řádově) méně než mapperů | + | * „redukuje“ list hodnot čtených z výstupy Shuffle & Sort |
- | * Počet lze definovat, default je 1 | + | * zpravidla je reducerů (řádově) méně než mapperů |
- | * Každý reducer generuje 1 soubor do HDFS | + | * počet lze definovat, default je 1 |
- | * Výstup se nijak nesortuje | + | * každý reducer generuje 1 soubor do HDFS |
+ | * výstup se nijak nesortuje | ||
Combiner | Combiner | ||
* sníží zátěž Shuffle&Sort části | * sníží zátěž Shuffle&Sort části | ||
- | * Volitelná část zpracování mapperu, provádí reduce na straně mapperu | + | * volitelná část zpracování mapperu, provádí reduce na straně mapperu |
- | * Stejné rozhraní jako Reducer | + | * stejné rozhraní jako Reducer |
- | * Proč použít combiner | + | * používáme, protože Shuffle&Sort je nejnáročnější operace, tohle jí uleví |
- | * 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 | ||
Řádek 52: | Řádek 49: | ||
* podle hodnoty | * podle hodnoty | ||
* MapReduce zajišťuje, že jedna partition je zpracována jedním reducerem | * MapReduce zajišťuje, že jedna partition je zpracována jedním reducerem | ||
- | * Vlastní partitioner lze použít např. v případech, kdy | + | * vlastní partitioner lze použít např. v případech, kdy |
* chci znát nějaké specifické rozdělení (např. věkové kategorie) | * 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) | * 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 | ||
Řádek 60: | Řádek 59: | ||
* vhodné úlohy | * 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 | * 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 | ||
+ | * umožňující paralelizaci, při práci se skutečně velkými daty (PB), 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í | ||
* nevhodné úlohy | * nevhodné úlohy | ||
* průměr, medián - lze přeformulovat | * průměr, medián - lze přeformulovat | ||
+ | * nelze paralelizovat, je-li vyžadována okamžitá reakce, když je úkol „malý“ | ||
+ | * musí splňovat 3 podmínky | ||
+ | * asociativita - neovlivníme pořadí vykonávaných operací | ||
+ | * komutativita - mapper/shuffle může změnit pořadí dat -> lze použít combiner | ||
+ | * existence nulového prvku - node, který nemá výstup/nezpracovává data, neovlivní výsledek | ||
- | |||
- | |||
- | 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.1503569724.txt.gz · Poslední úprava: 24.08.2017 12:15 autor: kj