Настройката на производителността ще помогне за оптимизиране на вашия Hadoop производителност. В този блог ще обсъдим всички тези техники за оптимизация на MapReduce Job.
В този урок за MapReduce ще ви предоставим 6 важни съвета за оптимизиране на заданията на MapReduce, като например правилна конфигурация на вашия клъстер, използване на LZO компресия, правилна настройка на броя задачи на MapReduce и т.н.
Съвети за оптимизиране на заданията на MapReduce
По-долу са дадени някои техники за оптимизиране на заданието в MapReduce, които биха ви помогнали при оптимизирането на работата на MapReduce.
1. Правилна конфигурация на вашия клъстер
- С -noatime Монтират се опция Dfs и MapReduce за съхранение. Това ще деактивира времето за достъп. По този начин подобрява I/O производителността.
- Опитайте се да избегнете RAID на TaskTracker и машини с възли за данни. Това обикновено намалява производителността.
- Уверете се, че сте конфигурирали mapred.local.dir и dfs.data.dir за да посочите една директория на всеки от вашите дискове. Това е, за да се гарантира, че целият ви I/O капацитет се използва.
- Трябва да наблюдавате графиката на използване на суап и използване на мрежата със софтуер. Ако видите, че се използва суап, трябва да намалите количеството RAM, разпределено за всяка задача в mapred.child.java.opts .
- Уверете се, че трябва да имате интелигентен мониторинг на здравословното състояние на вашите дискови устройства. Това е една от важните практики за настройка на производителността на MapReduce.
2. Използване на LZO компресия
За междинни данни това винаги е добра идея. Всяко задание на Hadoop, което генерира непренебрежимо малко количество изходна карта, ще се възползва от междинно компресиране на данни с LZO.
Въпреки че LZO добавя малко режийни разходи към процесора, той спестява време, като намалява количеството дисково IO по време на разбъркването.
Задайте mapred.compress.map.output на true, за да активирате LZO компресия
3. Правилна настройка на броя задачи на MapReduce
- В заданието MapReduce, ако всяка задача отнема 30-40 секунди или повече, това ще намали броя на задачите. картографът или редуктор процесът включва следните неща:първо, трябва да стартирате JVM (JVM, зареден в паметта). След това трябва да инициализирате JVM. И след обработка (mapper/reducer) трябва да деинициализирате JVM. И тези JVM задачи са много скъпи. Да предположим случай, в който mapper изпълнява задача само за 20-30 секунди. За целта трябва да стартираме/инициализираме/спиране на JVM. Това може да отнеме значително време. Затова е строго препоръчително задачата да се изпълнява поне за 1 минута.
- Ако задание има повече от 1TB вход. След това трябва да помислите за увеличаване на размера на блока на входния набор от данни до 256M или дори 512M. Така че броят на задачите ще бъде по-малък. Можете да промените размера на блока с помощта на командата Hadoop distcp –Hdfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks
- Тъй като знаем, че всяка задача се изпълнява поне 30-40 секунди. Трябва да увеличите броя на задачите за картографиране до малко кратно на броя на слотовете за картографиране в клъстера.
- Не изпълнявайте твърде много редуцирани задачи – за повечето работни места. Броят задачи за намаляване, равен на или малко по-малък от броя на слотове за намаляване в клъстера.
4. Комбинатор между Mapper и Reducer
Ако алгоритъмът включва изчисление на агрегати от всякакъв вид, тогава трябва да използваме Combiner. Combiner извършва известно агрегиране, преди данните да стигнат до редуктор.
Рамката на Hadoop MapReduce се изпълнява интелигентно, за да се намали количеството данни за запис на диск. И тези данни трябва да се прехвърлят между етапите на изчисление Map и Reduce.
5. Използване на най-подходящия и компактен записваем тип за данни
Потребителите на големи данни използват ненужно типа Text за запис, за да преминат от Hadoop Streaming към Java MapReduce. Текстът може да бъде удобен. Неефективно е да конвертирате числови данни към и от UTF8 низове. И всъщност може да съставлява значителна част от времето на процесора.
6. Повторна употреба на записи
Много потребители на MapReduce правят една много често срещана грешка, която е да разпределят нов записващ обект за всеки изход от мапер/редуктор. Да предположим, например, реализацията на преобразувател на броя на думите, както следва:
public void map(...) { ... for (String word: words) { output.collect(new Text(word), new IntWritable(1)); }
Тази реализация причинява разпределение на хиляди краткотрайни обекти. Докато инструментът за събиране на боклук на Java върши разумна работа при справянето с това, по-ефективно е да се пише:
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); } } }
Заключение
Следователно има различни техники за оптимизиране на задания MapReduce, които ви помагат да оптимизирате заданието на MapReduce. Подобно на използването на комбинатор между mapper и Reducer, чрез използване на LZO компресия, правилна настройка на броя на MapReduce задачи, повторно използване на записваеми.
Ако намерите друга техника за оптимизиране на заданията MapReduce, уведомете ни в секцията за коментари, дадена по-долу.