V prvním díle tohoto seriálu jsme se věnovali základním aspektům implementace Hadoopu v prostředí Azure. Dnes se podíváme na jeho základní stavební kámen – distribuovaný výpočetní stroj pracující na principu MapReduce. Na konci čtení asi zjistíte, že byste chtěli větší komfort práce s daty – dostanete ho v zítřejším třetím díle.

Co je MapReduce?

Koho zajímá podrobný výklad, může se podívat např. na článek na Wikipedii. Zjednodušený výklad je následovný: daná úloha (typicky sada souborů, které je třeba zpracovat) se rozdělí na řadu menších úloh, čehož se typicky dosáhne čtením řádků z textových souborů (co řádek, to úloha). V kroku Map se potom provede zpracování, kdy z každé vstupní hodnoty (řádku) se vygeneruje jeden nebo více párů elementárních výsledků – ve formátu (klíč, hodnota). Ve druhém kroku (Reduce) se všechny elementární výsledky z prvního kroku se stejným klíčem  sesumarizují do nějakého konečného výsledku. Ten se uloží opět ve formě textového souboru a může se eventuálně dále zpracovávat.

“Hello World” příkladem pro tento algoritmus je počítání frekvence výskytu slov v textových souborech sloužících jako vstup. Funkce Map má na vstupu jeden řádek textu a na výstupu dvojice [slovo, počet výskytů], které snadno získáme analýzou vstupního řetězce. Funkce Reduce pak má ma vstupu strukturu [slovo, {počet výskytů 1, počet výskytů 2, …} a na výstupu dvojici [slovo, celkový počet výskytů], kde celkový počet získáme prostým součtem.

Pokud si říkáte, že něco takového mnohem rychleji a pohodlněji uděláte v konzolové aplikaci v C#, tak máte samozřejmě pravdu. Výhodu MapReduce přístupu totiž oceníte až v okamžiku, kdy vstupních souborů bude milión a vaše aplikace poběží desítky hodin, protože nedokáže úlohu rozdistribuovat mezi více systémů a jste omezeni hardwarem jediného výpočetního stroje. Pak rádi sáhnete po Hadoopu a MapReduce přístupu.

Příklad spuštění úlohy v Azure HDInsight

Vytvořený Hadoop cluster obsahuje několik ukázkových MapReduce úloh, k jejichž dokumentaci se dostanete přes dlaždici Samples na domovské stránce clusteru:

image

Pro začátek zvolíme klasickou úlohu WordCount, vše důležité k ní najdete v popisu:

image

Po provedení volby Deploy to your cluster máte možnost úlohu spustit (v tu chvíli již jsou potřebné soubory nakopírovány na svých místech):

image

Po dokončení úlohy vidíte v historii spuštěnou úlohu a její výsledek, na který se můžete podívat i ve větším detailu (je to ta prostřední):

image

Samozřejmě si můžete zobrazit též soubor s výsledkem:

image

Rovněž můžete sledovat statistiky vytíženosti clusteru:

image

Jak vytvořit vlastní MapReduce úlohu?

Pokud si chcete vytvořit vlastní úlohu, není to až tak složité. Spíše než psaním kódu strávíte více času kopírováním souborů na správná místa a laděním různých parametrů spouštěných programů. Možností jak psát MapReduce programy je více, uveďme si tři základní:

  • Java – vzhledem k tomu, že celý Hadoop je v Javě napsán, je to v podstatě “nativní” volba. Konfigurace, funkce Map i funkce Reduce se zkompilují do jedné JAR knihovny a ta je poté spuštěna. Tento přístup si můžete vyzkoušet v tomto tutoriálu (pozor, v Java kódu je třeba nahradit kopírováním vzniklé sekvence &lt; a &gt; znaky < a >).
  • Jednoduchý JavaScript spouštěný z prostředí Pig – nejjednodušší možnost z hlediska množství napsaného kódu a též jednoduchosti spuštění a nasazení. Popis příkladu použití najdete v dokumentaci k příkladu WordCount.
  • C# knihovna – zde můžete s výhodou využít Microsoft .NET SDK for Hadoop. Komponenty Map a Reduce se vytvářejí jako jednoduché třídy odvozené z abstraktních základních tříd. Je však třeba říci, že knihovna stále ještě není v produkční verzi – můžete se tedy místy dočkat nepříjemných překvapení. Pokud jste zvyklí na .NET framework, nabízí vám ovšem tento přístup naprosto bezkonkurenční komfort.

Závěrem

Po přečtení možná máte pocit, že vás článek navrací kamsi do pravěku. Měl jsem ho i já. Ve skutečnosti pravděpodobně nebudete svoje MapReduce joby psát nikdy výše naznačeným způsobem. Dnes už prakticky nikdo nepíše C++ kód pro manipulaci s daty a místo toho využívá relační databázi (kterou za vás někdo v C++ napsal, protože je to nejrychlejší způob). S velkými daty je to podobné – nikomu se nechce psát stále dokola kód pro parsování textu, filtrování, třídění, seskupování, slučování apod. Ve světě Big Data proto zpravidla sáhnete po technologiích, které vám umožní manipulovat s velmi velkými daty na mnohem větší úrovni abstrakce – zejména Hive a Pig. Obě technologie si představíme v zítřejším závěrečném díle miniseriálu.

Michael