Hadoop používá programovací model MapReduce pro zpracování dat vstupu a výstupu pro mapu a pro redukci funkcí reprezentovaných jako páry klíč-hodnota. Podléhají paralelnímu provádění datových sad umístěných v široké řadě strojů v distribuované architektuře. Programovací paradigma je ve své podstatě funkční v kombinování při použití techniky mapy a zmenšení. Tento článek představuje model MapReduce a zejména to, jak se používají data v různých formátech, od jednoduchého textu po strukturované binární objekty.
Typy MapReduce
Mapování je základní technika zpracování seznamu datových prvků, které přicházejí v párech klíčů a hodnot. Funkce mapy se vztahuje na jednotlivé prvky definované jako páry klíč–hodnota seznamu a vytváří nový seznam. Obecná myšlenka mapování a redukce funkce Hadoop může být ilustrována následovně:
map: (K1, V1) -> list (K2, V2) reduce: (K2, list(V2)) -> list (K3, V3)
Vstupní parametry páru klíč a hodnota, reprezentované K1 a V1, se liší od typu výstupního páru:K2 a V2. Funkce zmenšení přijímá výstup ve stejném formátu z mapy, ale typ výstupu operace zmenšení je opět odlišný:K3 a V3. Java API pro to je následující:
public interface Mapper<K1, V1, K2, V2> extends JobConfigurable, Closeable { void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter reporter) throws IOException; } public interface Reducer<K2, V2, K3, V3> extends JobConfigurable, Closeable { void reduce(K2 key, Iterator<V2> values, OutputCollector<K3, V3> output, Reporter reporter)throws IOException; }
OutputCollector je zobecněné rozhraní rámce Map-Reduce pro usnadnění sběru datového výstupu buď pomocí Mapperu nebo Redukce . Tyto výstupy nejsou nic jiného než mezivýstup úlohy. Proto musí být parametrizovány svými typy. Reportér usnadňuje aplikaci Map-Reduce hlásit průběh a aktualizovat počítadla a stavové informace. Pokud je však použita funkce kombinování, má stejný tvar jako funkce snížení a výstup je přiveden do funkce snížení. To lze znázornit následovně:
map: (K1, V1) -> list (K2, V2) combine: (K2, list(V2)) -> list (K2, V2) reduce: (K2, list(V2)) -> list (K3, V3)
Všimněte si, že funkce kombinovat a zmenšit používají stejný typ, s výjimkou jmen proměnných, kde K3 je K2 a V3 je V2.
Funkce oddílu pracuje s mezilehlými typy klíč–hodnota. Řídí rozdělení klíčů přechodných mapových výstupů. Klíč odvozuje oddíl pomocí typické hashovací funkce. Celkový počet oddílů je stejný jako počet úloh snížení pro úlohu. Oddíl je určen pouze klíčem ignorujícím hodnotu.
public interface Partitioner<K2, V2> extends JobConfigurable { int getPartition(K2 key, V2 value, int numberOfPartition); }
To je ve zkratce klíčová podstata typů MapReduce.
Vstupní formáty
Hadoop musí přijímat a zpracovávat různé formáty, od textových souborů po databáze. Část vstupu, nazývaná rozdělení vstupu , je zpracována jedinou mapou. Každé rozdělení je dále rozděleno na logické záznamy dané mapě ke zpracování v páru klíč-hodnota. V kontextu databáze rozdělení znamená čtení rozsahu n-tic z tabulky SQL, jak to dělá DBInputFormat a produkovat LongWritables obsahující čísla záznamů jako klíče a DBWritables jako hodnoty. Java API pro vstupní rozdělení je následující:
public interface InputSplit extends Writable { long getLength() throws IOException; String[] getLocations() throws IOException; }
InputSplit představuje data, která mají být zpracována Mapperem . Vrací délku v bajtech a má odkaz na vstupní data. Představuje bajtově orientovaný pohled na vstup a odpovídá za něj RecordReader úkolu zpracovat toto a předložit pohled orientovaný na záznamy. Ve většině případů se InputSplit nezabýváme přímo, protože jsou vytvořeny InputFormat . Je to odpovědností InputFormat vytvořit vstupní rozdělení a rozdělit je do záznamů.
public interface InputFormat<K, V> { InputSplit[] getSplits(JobConf job, int numSplits) throws IOException; RecordReader<K, V> getRecordReader(InputSplit split, JobConf job, throws IOException; }
JobClient vyvolá getSplits() metoda s příslušným počtem rozdělených argumentů. Uvedené číslo je nápovědou, protože skutečný počet rozdělení se může od daného počtu lišit. Jakmile je rozdělení vypočítáno, je odesláno do jobtrackeru. Jobtracker naplánuje mapové úlohy pro tasktrackery pomocí umístění úložiště. Tasktracker pak provede rozdělení vyvoláním getRecordReader() metoda na InputFormat získat RecordReader pro rozdělení.
FileInputFormat je základní třída pro souborový zdroj dat. Má odpovědnost za identifikaci souborů, které mají být zahrnuty jako vstup úlohy a definici pro generování rozdělení.
Hadoop také zahrnuje zpracování nestrukturovaných dat, která často přicházejí v textovém formátu. TextInputFormat je výchozí InputFormat pro taková data.
SequenceInputFormat zabírá binární vstupy a ukládá sekvence binárních párů klíč–hodnota.
Podobně DBInputFormat poskytuje schopnost číst data z relační databáze pomocí JDBC.
Výstupní formáty
Třídy výstupního formátu jsou podobné jejich odpovídajícím třídám vstupního formátu a fungují v opačném směru.
Například TextOutputFormat je výchozí výstupní formát, který zapisuje záznamy jako soubory prostého textu, zatímco páry klíč–hodnota mohou být libovolného typu a převádí je na řetězec vyvoláním toString() metoda. Znak klíč–hodnota je oddělen znakem tabulátoru, i když to lze upravit úpravou vlastnosti separátoru výstupního formátu textu.
Pro binární výstup existuje SequenceFileOutputFormat k zápisu sekvence binárního výstupu do souboru. Binární výstupy jsou zvláště užitečné, pokud se výstup stane vstupem pro další úlohu MapReduce.
Výstupní formáty pro relační databáze a do HBase zpracovává DBOutputFormat . Odešle redukovaný výstup do SQL tabulky. Například TableOutputFormat HBase umožňuje programu MapReduce pracovat s daty uloženými v tabulce HBase a používat je pro zápis výstupů do tabulky HBase.
Závěr
To je ve zkratce jádro typů a formátů MapReduce. Další podrobnosti o nich získáte v seznamu v níže uvedeném odkazu. Existuje mnoho složitých podrobností o funkcích Java API, které se stanou jasnějšími, až když se člověk ponoří do programování. Další podrobnosti a začněte kódovat některé postupy naleznete v dokumentech Apache Hadoop Java API.
Odkazy
- Tom White, Hadoop The Definitive Guide , O’Reilly
- Dokumenty Apache Hadoop Java API