Professional Documents
Culture Documents
МЗОВД 03
МЗОВД 03
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)