Создание классов Mapper и Reducer
В этом шаге мы углубимся в суть Hadoop MapReduce и создадим свои собственные классы Mapper и Reducer.
Исследование файла с данными
Сначала используйте команду su - hadoop
, чтобы сменить идентификацию. Файл с данными data.txt
хранится в директории /user/hadoop/input
HDFS, которая содержит содержимое разговоров некоторых людей. Используйте следующую команду, чтобы просмотреть содержимое:
hdfs dfs -cat /user/hadoop/input/data.txt
Пользовательский Mapper
Далее мы создадим пользовательский класс Mapper под названием WordCountMapper
, который наследуется от Mapper
. Этот Mapper будет обрабатывать входные данные и генерировать пары ключ-значение, при этом учитывайте, что обрабатываемые данные - это содержимое каждой строки разговора, а не имена людей. Смотрите следующий пример, чтобы дополнить метод map
в WordCountMapper.java
в директории /home/hadoop/
.
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Преобразуем объект Text в строку
String line = value.toString();
// Разбиваем строку с помощью StringTokenizer
StringTokenizer tokenizer = new StringTokenizer(line);
// Перебираем каждый токен и записываем его в контекст
while (tokenizer.hasMoreTokens()) {
// Устанавливаем текущее слово
word.set(tokenizer.nextToken().trim());
// Записываем слово и его количество в контекст
context.write(word, one);
}
}
Затем используйте следующую команду, чтобы скомпилировать код в версии java 8:
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountMapper.java
Пользовательский Reducer
Наконец, мы создадим пользовательский класс Reducer под названием WordCountReducer
, который наследуется от Reducer
. Этот Reducer будет агрегировать значения для каждого ключа и генерировать окончательный результат. Дополните метод reduce
в WordCountReducer.java
в директории /home/hadoop/
следующим примером.
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
// Инициализируем переменную для хранения суммы количества для каждого слова
int sum = 0;
// Перебираем все количества для текущего слова и вычисляем общую сумму
for (IntWritable value : values) {
sum += value.get();
}
// Устанавливаем окончательное количество для текущего слова
result.set(sum);
// Записываем слово и его окончательное количество в контекст
context.write(key, result);
}
Затем используйте следующую команду, чтобы скомпилировать код в версии java 8:
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountReducer.java