Hadoop Shuffle Combiner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Представьте себе ситуацию, в которой вы - талантливый инженер, ответственный за управление данными в системе симуляции космической битвы. Ваша цель - оптимизировать производительность системы, реализовав технику Hadoop Shuffle Combiner в процессе MapReduce. Используя Combiner, вы стремитесь уменьшить сетевой трафик и повысить общую эффективность обработки данных во время симуляции.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hadoop(("Hadoop")) -.-> hadoop/HadoopHiveGroup(["Hadoop Hive"]) hadoop(("Hadoop")) -.-> hadoop/HadoopMapReduceGroup(["Hadoop MapReduce"]) hadoop(("Hadoop")) -.-> hadoop/HadoopYARNGroup(["Hadoop YARN"]) hadoop/HadoopMapReduceGroup -.-> hadoop/setup_jobs("Setting up MapReduce Jobs") hadoop/HadoopMapReduceGroup -.-> hadoop/mappers_reducers("Coding Mappers and Reducers") hadoop/HadoopMapReduceGroup -.-> hadoop/shuffle_combiner("Shuffle Combiner") hadoop/HadoopYARNGroup -.-> hadoop/yarn_jar("Yarn Commands jar") hadoop/HadoopHiveGroup -.-> hadoop/process("Process Control Function") hadoop/HadoopHiveGroup -.-> hadoop/aggregating("Aggregating Function") hadoop/HadoopHiveGroup -.-> hadoop/udf("User Defined Function") subgraph Lab Skills hadoop/setup_jobs -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/mappers_reducers -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/shuffle_combiner -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/yarn_jar -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/process -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/aggregating -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/udf -.-> lab-271904{{"Hadoop Shuffle Combiner"}} end

Написание 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 для выполнения окончательного агрегирования пар ключ-значение.

  1. Создайте 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. Эта лаборатория была направлена на расширение вашего понимания сокращения сети и повышения вычислительной эффективности в задачах обработки больших данных.