Ladění výkonu pomůže optimalizovat vášhadoop výkon. V tomto blogu budeme diskutovat o všech těchto technikách optimalizace MapReduce Job.
V tomto tutoriálu MapReduce vám poskytneme 6 důležitých tipů pro optimalizaci úloh MapReduce, jako je správná konfigurace vašeho clusteru, použití komprese LZO, správné vyladění počtu úloh MapReduce atd.
Tipy pro optimalizaci úlohy MapReduce
Níže jsou uvedeny některé techniky optimalizace práce MapReduce, které vám pomohou při optimalizaci výkonu úlohy MapReduce.
1. Správná konfigurace vašeho clusteru
- S -noatime je připojeno úložiště Dfs a MapReduce. Tím se zakáže doba přístupu. Tím se zlepšuje výkon I/O.
- Snažte se vyhnout RAID na strojích TaskTracker a datanode. To obecně snižuje výkon.
- Ujistěte se, že jste nakonfigurovali mapred.local.dir a dfs.data.dir ukázat na jeden adresář na každém z vašich disků. Tím zajistíte, že bude využita veškerá vaše I/O kapacita.
- Měli byste sledovat graf využití swapu a využití sítě pomocí softwaru. Pokud vidíte, že se používá swap, měli byste snížit množství paměti RAM přidělené každé úloze v mapred.child.java.opts .
- Ujistěte se, že byste měli mít inteligentní sledování stavu vašich diskových jednotek. Toto je jeden z důležitých postupů pro ladění výkonu MapReduce.
2. Využití komprese LZO
Pro mezilehlá data je to vždy dobrý nápad. Každá úloha Hadoop, která generuje nezanedbatelné množství mapového výstupu, bude těžit ze střední komprese dat pomocí LZO.
Ačkoli LZO přidává trochu režie na CPU, šetří čas tím, že snižuje množství IO disku během náhodného přehrávání.
Nastavte mapred.compress.map.output na hodnotu true pro povolení komprese LZO
3. Správné vyladění počtu úloh MapReduce
- Pokud v úloze MapReduce každý úkol trvá 30–40 sekund nebo déle, sníží se počet úkolů. mapovač nebo reduktor proces zahrnuje následující věci:nejprve musíte spustit JVM (JVM načtené do paměti). Poté musíte inicializovat JVM. A po zpracování (mapovač/reduktor) je potřeba deinicializovat JVM. A tyto úkoly JVM jsou velmi nákladné. Předpokládejme případ, kdy mapper spustí úlohu pouze na 20–30 sekund. K tomu potřebujeme spustit/inicializovat/zastavit JVM. To může trvat značné množství času. Proto se důrazně doporučuje spustit úlohu alespoň 1 minutu.
- Pokud má úloha více než 1 TB vstupu. Pak byste měli zvážit zvýšení velikosti bloku vstupní datové sady na 256M nebo dokonce 512M. Takže počet úkolů bude menší. Velikost bloku můžete změnit pomocí příkazu Hadoop distcp –Hdfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks
- Jak víme, každá úloha běží minimálně 30–40 sekund. Měli byste zvýšit počet úloh mapovače na nějaký násobek počtu slotů mapovače v clusteru.
- Neprovozujte příliš mnoho úloh s omezením – pro většinu úloh. Počet úloh snížení je stejný nebo o něco menší než počet slotů snížení v clusteru.
4. Slučovač mezi Mapperem a Reducer
Pokud algoritmus zahrnuje výpočet agregátů jakéhokoli druhu, měli bychom použít Combiner. Combiner provede určitou agregaci, než se data dostanou do reduktoru.
Spuštění rámce Hadoop MapReduce se inteligentně kombinují, aby se snížilo množství dat zapisovaných na disk. A tato data je třeba přenést mezi fázemi výpočtu Map a Reduce.
5. Použití nejvhodnějšího a nejkompaktnějšího zapisovatelného typu pro data
Uživatelé velkých dat používají typ zapisovatelný text zbytečně, aby přešli z Hadoop Streamingu na Java MapReduce. Text může být pohodlný. Převádět číselná data do az řetězců UTF8 je neefektivní. A ve skutečnosti může tvořit významnou část času CPU.
6. Opětovné použití zapisovatelných souborů
Mnoho uživatelů MapReduce dělá jednu velmi častou chybu, a to alokaci nového zapisovatelného objektu pro každý výstup z mapovače/reduktoru. Předpokládejme například následující implementaci mapovače počtu slov:
public void map(...) { ... for (String word: words) { output.collect(new Text(word), new IntWritable(1)); }
Tato implementace způsobuje alokaci tisíců objektů s krátkou životností. Zatímco Java garbage collector odvádí rozumnou práci při řešení tohoto problému, je efektivnější psát:
class MyMapper ... { Text wordText = new Text(); IntWritable one = new IntWritable(1); public void map(...) { ... for (String word: words) { wordText.set(word); output.collect(word, one); } } }
Závěr
Proto existují různé techniky optimalizace úloh MapReduce, které vám pomohou při optimalizaci úlohy MapReduce. Stejně jako použití slučovače mezi mapovačem a Reducerem, používáním komprese LZO, správným vyladěním počtu úloh MapReduce, opětovným použitím zapisovatelného.
Pokud najdete jinou techniku pro optimalizaci úlohy MapReduce, dejte nám vědět v sekci komentářů níže.