Реализация Mapper и Reducer
В этом шаге мы создадим классы Mapper и Reducer для обработки данных о книгах с использованием парадигмы MapReduce.
Custom BookMapper
Во - первых, создайте новый Java - файл с именем BookMapper.java
в директории /home/hadoop
со следующим содержимым:
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
// BookMapper расширяет класс Mapper для обработки текстовых входных файлов
// Входные пары ключ-значение - LongWritable (номер строки) и Text (содержание строки)
// Выходные пары ключ-значение - Text (имя автора) и Book (детали книги)
public class BookMapper extends Mapper<LongWritable, Text, Text, Book> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Разделяем входную строку по запятой
String[] bookData = value.toString().split(",");
// Извлекаем название, автора и год из входной строки
String title = bookData[0];
String author = bookData[1];
int year = Integer.parseInt(bookData[2]);
// Записываем автора и детали книги в контекст
context.write(new Text(author), new Book(title, author, year));
}
}
Этот класс BookMapper
принимает строку входных данных в формате "title,author,year"
и выдает пару ключ-значение с автором в качестве ключа и объектом Book
в качестве значения.
Custom BookReducer
Далее, создайте новый Java - файл с именем BookReducer.java
в директории /home/hadoop
со следующим содержимым:
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
// BookReducer расширяет класс Reducer для агрегации деталей книг по автору
// Входные пары ключ-значение - Text (имя автора) и Book (детали книги)
// Выходные пары ключ-значение - Text (имя автора) и Book (агрегированные детали книги)
public class BookReducer extends Reducer<Text, Book, Text, Book> {
@Override
protected void reduce(Text key, Iterable<Book> values, Context context) throws IOException, InterruptedException {
// Перебираем книги для одного и того же автора и записываем каждую книгу в контекст
for (Book book : values) {
context.write(key, book);
}
}
}
Этот класс BookReducer
просто выдает входные пары ключ-значение без изменений, фактически группируя книги по автору.
Компиляция файлов
Наконец, вам нужно скомпилировать Java - классы с использованием следующих команд:
## Компилируем Java - классы
javac -source 8 -target 8 -classpath $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. BookMapper.java BookReducer.java