Введение
Представьте себе ситуацию, в которой вы - талантливый инженер, ответственный за управление данными в системе симуляции космической битвы. Ваша цель - оптимизировать производительность системы, реализовав технику Hadoop Shuffle Combiner в процессе MapReduce. Используя Combiner, вы стремитесь уменьшить сетевой трафик и повысить общую эффективность обработки данных во время симуляции.
Напишите Mapper
В этом шаге вы напишете класс Mapper для обработки входных данных и выдачи промежуточных пар ключ-значение.
Откройте терминал и следуйте шагам ниже, чтобы начать.
Перейдите в учетную запись hadoop, а затем переключитесь в домашнюю директорию пользователя hadoop:
su - hadoop
Создайте Java-файл для класса Mapper:
nano /home/hadoop/SpaceBattleMapper.java
Затем добавьте следующий код в файл SpaceBattleMapper.java:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import java.io.IOException;
public class SpaceBattleMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Разделите входную строку на слова
String[] words = value.toString().split("\\s+");
// Выдайте пару ключ-значение для каждого слова
for (String w : words) {
word.set(w);
context.write(word, one);
}
}
}
Советы: Вы можете скопировать код из окна подсказок справа и вставить его с помощью Ctrl + Shift + V в открытый редактор nano. Нажмите Ctrl + O, чтобы сохранить файл, и Enter, чтобы подтвердить, когда вас попросит nano-редактор. Наконец, используйте Ctrl + X, чтобы выйти из редактора.
Класс SpaceBattleMapper расширяет класс Mapper из Hadoop-фреймворка. Он используется для обработки входных данных в виде пар ключ-значение, где ключ - это LongWritable, представляющий байтовый сдвиг строки в входном файле, а значение - это объект Text, представляющий строку текста.
Класс определяет два приватных поля:
one: ОбъектIntWritableс постоянным значением 1. Это используется в качестве значения в выдаваемых парах ключ-значение.word: ОбъектText, используемый для хранения каждого слова, извлеченного из входной строки.
Метод map переопределяется для предоставления конкретной логики сопоставления:
- Входное значение
Textпреобразуется в строку и разделяется на слова по пробелу. - Для каждого слова в массиве объект
wordустанавливается в это слово, и выдается пара ключ-значение с словом в качестве ключа иoneв качестве значения. Это делается с помощью методаcontext.write.
Этот класс Mapper предназначен для выдачи пары ключ-значение для каждого слова в входных данных, где ключ - это слово, а значение - это целое число 1. Эта схема обычно используется в приложениях подсчета слов, где цель - подсчитать количество вхождений каждого слова в наборе данных.
Реализуйте Combiner
В этом шаге вы реализуете класс Combiner для выполнения локального агрегирования перед перемешиванием данных.
Создайте Java-файл для класса Combiner:
nano /home/hadoop/SpaceBattleCombiner.java
Затем добавьте следующий код в файл SpaceBattleCombiner.java:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class SpaceBattleCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
// Суммируйте значения для каждого ключа
for (IntWritable val : values) {
sum += val.get();
}
// Выдайте ключ и сумму его значений
context.write(key, new IntWritable(sum));
}
}
Класс SpaceBattleCombiner расширяет класс Reducer из Hadoop-фреймворка. Он используется в качестве комбинера в процессе MapReduce для выполнения локального агрегирования промежуточных пар ключ-значение, выданных Mapper.
Класс переопределяет метод reduce для предоставления конкретной логики комбинера:
- Метод принимает ключ типа
Textи итерируемый объект значений типаIntWritableв качестве входных данных. Ключ представляет слово, а итерируемый объект содержит количество вхождений этого слова. - Метод итерируется по значениям, суммируя их, чтобы получить общее количество для слова.
- Наконец, метод выдает пару ключ-значение с словом в качестве ключа и общим количеством в качестве значения с использованием метода
context.write.
Цель SpaceBattleCombiner - выполнить локальное агрегирование количества для каждого слова перед перемешиванием данных по сети к Reducer. Это уменьшает количество передаваемых данных между фазами Mapper и Reducer, повышает эффективность MapReduce-задания.
Реализуйте Reducer
В этом шаге вы реализуете класс Reducer для выполнения окончательного агрегирования пар ключ-значение.
- Создайте Java-файл для класса Reducer:
nano /home/hadoop/SpaceBattleReducer.java
Затем добавьте следующий код в файл SpaceBattleReducer.java:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class SpaceBattleReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
Класс SpaceBattleReducer расширяет класс Reducer из Hadoop-фреймворка. Он используется для выполнения окончательного агрегирования промежуточных пар ключ-значение, выданных Mapper и необязательно обработанных Combiner.
Класс переопределяет метод reduce для предоставления конкретной логики редьюсера:
- Метод принимает ключ типа
Textи итерируемый объект значений типаIntWritableв качестве входных данных. Ключ представляет слово, а итерируемый объект содержит количество вхождений этого слова. - Метод итерируется по значениям, суммируя их, чтобы получить общее количество для слова.
- Наконец, метод выдает пару ключ-значение с словом в качестве ключа и общим количеством в качестве значения с использованием метода
context.write.
SpaceBattleReducer выполняет окончательное агрегирование данных, суммируя количество для каждого слова по всем выходам Mapper. Это дает окончательное количество вхождений для каждого слова в входных данных.
Напишите Driver
В этом шаге вы создадите Java-файл для управления MapReduce-заданием, включая настройку конфигурации задания и указание классов Mapper, Combiner и Reducer.
Создайте Java-файл для класса Driver:
nano /home/hadoop/SpaceBattleDriver.java
Затем добавьте следующий код в файл SpaceBattleDriver.java:
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class SpaceBattleDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Space Battle Simulation");
job.setJarByClass(SpaceBattleDriver.class);
job.setMapperClass(SpaceBattleMapper.class);
job.setCombinerClass(SpaceBattleCombiner.class);
job.setReducerClass(SpaceBattleReducer.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);
}
}
Класс SpaceBattleDriver отвечает за конфигурацию и запуск MapReduce-задания для симуляции космической битвы.
Класс начинается с создания нового объекта
Configurationи экземпляраJobс этой конфигурацией. Заданию дается имя "Space Battle Simulation" для идентификации.Метод
setJarByClassвызывается с классомSpaceBattleDriver, чтобы установить jar-файл, содержащий классы, необходимые для задания.Методы
setMapperClass,setCombinerClassиsetReducerClassиспользуются для указания классов, которые будут выполнять задачи сопоставления, объединения и редукции соответственно.Методы
setOutputKeyClassиsetOutputValueClassопределяют типы выходного ключа и значения, которые в этом случае -TextиIntWritable.Методы
FileInputFormat.addInputPathиFileOutputFormat.setOutputPathустанавливают пути для входных и выходных данных. Эти пути передаются в качестве аргументов командной строки в метод main.Наконец, метод
job.waitForCompletionвызывается для отправки задания и ожидания его завершения. Метод возвращаетtrue, если задание завершается успешно, иfalseв противном случае. Программа завершается с кодом статуса 0, если задание выполнено успешно, и 1, если нет.
Этот класс Driver связывает все компоненты MapReduce-задания и является точкой входа для запуска задания.
Резюме
В этом лабаратории вы ознакомились с реализацией техники Hadoop Shuffle Combiner в сценарии симуляции космической битвы. Следуя шагам по созданию классов Mapper, Combiner, Reducer и Driver, вы приобрели практический опыт в оптимизации обработки данных в среде Hadoop MapReduce. Эта лаборатория была направлена на расширение вашего понимания сокращения сети и повышения вычислительной эффективности в задачах обработки больших данных.



