You are on page 1of 23

Програми MapReduce

Програма для MapReduce складається з трьох частин: функція map,


функція reduce та загальна частина для запуску завдання (job).

import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Map;
import java.util.HashMap;
Програми MapReduce
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.commons.lang.StringEscapeUtils;
Програми MapReduce
Відображувач (mapper)
public static class WordMapper
extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String txt = value.toString()
StringTokenizer itr = new StringTokenizer(txt);
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
Програми MapReduce
Відображувач (mapper)
Клас Mapper - це узагальнений клас з чотирма параметрами
формалізованого типу, які визначають вхідний ключ, вхідне значення,
вихідний ключ та типи вихідних значень функції відображення (map).
Замість використання вбудованих типів Java, Hadoop надає власний
набір базових типів, оптимізованих для мережевої серіалізації. Вони
знаходяться в пакеті org.apache.hadoop.io.
Методу map () передається ключ і значення. Метод map () також надає
екземпляр context для запису результату.
Програми MapReduce
Редуктор (reducer)
public static class CountReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
Програми MapReduce
Основна частина:
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf, "Word Counter");
job.setJarByClass(WordCounter.class);
job.setMapperClass(WordMapper.class);
job.setReducerClass(CountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
Програми MapReduce
Об'єкт Job встановлює особливості завдання і надає контроль над тим,
як виконується завдання. Коли ми виконуємо це завдання на кластері
Hadoop, ми будемо упаковувати код у файл JAR. Замість того, щоб чітко
вказувати ім’я файлу JAR, ми можемо передати клас у методі задання
setJarByClass () завдання, який Hadoop буде використовувати для
пошуку відповідного файлу JAR.
Програми MapReduce
Далі ми вказуємо типи map та reduce за допомогою методів
setMapperClass () та setReducerClass ().
Методи setOutputKeyClass () та setOutputValueClass () встановлюють
типи вихідних даних для функції reduce і повинні відповідати тому, що
є на виході класу Reduce. Типи вихідних даних map за замовчуванням
такі самі, тому їх не потрібно встановлювати, якщо mapper створює ті ж
типи, що і reducer. Однак, якщо вони різні, типи вихідних даних map
слід встановлювати за допомогою методів setMapOutputKeyClass () та
setMapOutputValueClass ().
Програми MapReduce
Створивши об'єкт Job, ми вказуємо вхідний і вихідний шляхи. Шлях
введення вказується шляхом виклику статичного методу addInputPath ()
у FileInputFormat, і це може бути один файл, каталог (у цьому випадку
вхідними будуть всі файли в цьому каталозі) або файли певного виду.
Як випливає з назви, addInputPath () можна викликати кілька разів для
використання вхідні дані з кількох шляхів.
Вихідний шлях (який існує лише один) визначається статичним
методом setOutputPath () у FileOutputFormat. Він вказує каталог, куди
записуються вихідні файли з функції redue. До запуску завдання
каталог не повинен існувати для того, щоб уникнути втрати даних у
випадку перезапису вже існуючого файлу.
Програми MapReduce
Після встановлення класів, які визначають функції map та reduce,
завдання готове для виконання. Метод waitForCompletion () у Job подає
завдання та чекає його завершення. Єдиним аргументом методу є
прапор, який вказує, чи генерується детальний вивід. Якщо значення
true, завдання виводить інформацію про прогрес на консоль.
Повернене значення методу waitForCompletion () - це булеве значення,
що вказує на успіх (true) або на помилку (false), яке ми перекладаємо у
код виходу програми 0 або 1.
Програми MapReduce
Завдання (job) MapReduce - це одиниця роботи, яку хоче виконати
клієнт: вона складається з вхідних даних, програми MapReduce та
інформації про конфігурацію. Hadoop виконує роботу, розділивши її на
задачі, з яких є два типи: map та reduce задачі. Задачі плануються за
допомогою YARN і виконуються на вузлах кластера. Якщо задачу не
вдається виконати, її буде автоматично перенесено на виконання на
іншому вузлі.
Hadoop поділяє вхідні дані до завдання MapReduce на шматки
фіксованого розміру, які називаються вхідними фрагментами або
просто фрагментами. Hadoop створює одну задачу map для кожного
фрагменту, яка запускає визначену користувачем функцію map для
кожного запису в фрагменті.
Потік даних у випадку з однією задачею
reduce
Потік даних у випадку з кількома задачами
reduce
Програми MapReduce
Багато завдань MapReduce обмежені пропускною здатністю,
доступною в кластері, тому варто мінімізувати дані, що передаються
між задачами map та reduce. Hadoop дозволяє користувачеві вказувати
функцію комбінатора (combiner) над вихідними даними map, а вихід
функції комбінатора формує вхід для функції reduce.

job.setCombinerClass()
Програми MapReduce
Функції map та reduce в Hadoop MapReduce мають такий загальний
вигляд:
map: (K1, V1) → list(K2, V2)
reduce: (K2, list(V2)) → list(K3, V3)

Якщо використовується combiner, тоді:


map: (K1, V1) → list(K2, V2)
combiner: (K2, list(V2)) → list(K2, V2)
reduce: (K2, list(V2)) → list(K3, V3)
Mapper
public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
public class Context extends MapContext<KEYIN, VALUEIN, KEYOUT,
VALUEOUT> {
// ...
}
protected void map(KEYIN key, VALUEIN value,
Context context) throws IOException, InterruptedException {
// ...
}
}
Reducer
public class Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
public class Context extends ReducerContext<KEYIN, VALUEIN, KEYOUT,
VALUEOUT> {
// ...
}
protected void reduce(KEYIN key, Iterable<VALUEIN> values,
Context context) throws IOException, InterruptedException {
// ...
}
}
Програми MapReduce
Об'єкти context використовуються для видачі пар ключ-значення, і
вони параметризуються вихідними типами, пари записується за
допомогою методу write ():
public void write(KEYOUT key, VALUEOUT value)
throws IOException, InterruptedException
Програми MapReduce
Як було зазначено раніше, фрагменти вхідних даних - це частина вхідних
даних, які обробляються одним map. Кожний map обробляє один фрагмент.
Кожен фрагмент поділяється на записи, і map по черзі обробляє кожен запис
—пару ключ-значення. У контексті бази даних фрагмент може відповідати
діапазону рядків з таблиці та запис —рядку в цьому діапазоні.
Розбиття на фрагменти реалізується класом:
public abstract class InputSplit {
public abstract long getLength() throws IOException,InterruptedException;
public abstract String[] getLocations() throws IOException,
InterruptedException;
}
Програми MapReduce
InputSplit має довжину в байтах і набір місць зберігання, які є просто
рядками імен хостів. Місця зберігання використовуються системою
MapReduce для розміщення задач map якомога ближче до даних
фрагменту, а розмір використовується для впорядкування фрагментів
таким чином, щоб найбільші оброблялися першими, з метою
мінімізувати час виконання завдання.
Вхідні формати MapReduce
Вихідні формати MapReduce
Програми MapReduce
Основні типи даних в Hadoop:
• BooleanWritable
• ByteWritable
• IntWritable
• FloatWritable
• LongWritable
• DoubleWritable
• Text
Hadoop має два типи класів для запису масивів: один для одновимірних та
інший для двовимірних масивів. Але елементами цих масивів повинні бути
лише інші об’єкти для запису, наприклад, IntWritable або LongWritable.

You might also like