Введение
В этом лабе вы научитесь настраивать форматы вывода и ввода в Hadoop MapReduce для эффективной обработки данных. С помощью руководства от Ghost Tutor вы приобретете навыки работы с разными типами данных и раскроете все возможности экосистемы Hadoop. Готовьтесь к увлекательному путешествию, чтобы овладеть искусством вычислений в сверхъестественном мире!
Написание 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
Написание пользовательских форматов ввода и вывода
В этом шаге мы укажем форматы ввода и вывода для задачи MapReduce.
Пользовательский формат ввода
Сначала создадим пользовательский формат ввода для чтения данных из определенного источника. Определим класс под названием PersonInputFormat, который наследуется от TextInputFormat и переопределяет метод getCurrentValue для обработки формата ввода. Дополните метод getCurrentValue в PersonInputFormat.java в директории /home/hadoop/ следующим примером.
@Override
public synchronized Text getCurrentValue() {
// Возвращаем значение текущей записи, делим ее по ":", удаляем начальные и конечные пробелы и устанавливаем в объект Text.
Text value = new Text();
Text line = super.getCurrentValue();
String[] parts = line.toString().split(":");
if (parts.length == 2) {
value.set(parts[1].trim());
}
return value;
}
Затем используйте следующую команду, чтобы скомпилировать код в версии 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:. PersonInputFormat.java
Пользовательский формат вывода
Далее создадим пользовательский формат вывода. Определим класс под названием CSVOutputFormat, который наследуется от TextOutputFormat. Дополните метод write в CSVOutputFormat.java в директории /home/hadoop/ следующим примером.
// Записываем пару ключ-значение в выходной поток в формате CSV
@Override
public void write(Text key, IntWritable value) throws IOException, InterruptedException {
out.writeBytes(key.toString() + "," + value.toString() + "\n");
}
Затем используйте следующую команду, чтобы скомпилировать код в версии 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:. CSVOutputFormat.java
Интеграция с Драйвером
В этом последнем шаге мы изменим класс WordCountDriver, чтобы использовать пользовательские форматы ввода и вывода, которые мы создали ранее.
Пользовательский Driver
Дополните функцию main в WordCountDriver.java в директории /home/hadoop/ следующим примером.
// Устанавливаем классы Mapper и Reducer
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
// Устанавливаем класс формата ввода в пользовательский формат ввода PersonInputFormat
job.setInputFormatClass(PersonInputFormat.class);
// Устанавливаем класс формата вывода в пользовательский формат вывода CSVOutputFormat
job.setOutputFormatClass(CSVOutputFormat.class);
Запуск задачи
Для запуска задачи Hadoop MapReduce с пользовательскими форматами ввода и вывода следуйте этим шагам:
Скомпилируйте
WordCountDriver.javaс использованием соответствующих зависимостей Hadoop.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:. WordCountDriver.javaСоздайте JAR-файл, содержащий скомпилированные классы.
jar -cvf mywordcount.jar *.classЗапустите класс
WordCountDriverс соответствующими путями ввода и вывода. Убедитесь, что путь вывода ранее не существовал.hadoop jar./mywordcount.jar WordCountDriver /user/hadoop/input /output
Эта команда запустит задачу Hadoop MapReduce с использованием пользовательских форматов ввода и вывода, которые мы определили.
Просмотр результатов вывода
Используйте следующую команду, чтобы проверить, успешно ли сгенерирован файл результата:
hdfs dfs -ls /output
hdfs dfs -cat /output/part.csv
Резюме
Поздравляем! В этом лабе вы успешно изучили сложности Hadoop MapReduce и освоили настройку форматов ввода и вывода под руководством Ghost Tutor. От создания классов Mapper и Reducer до преодоления таких проблем, как обработка несжимаемых файлов ввода, вы приобрели ценный опыт. С помощью практических заданий вы углубили свое понимание возможностей Hadoop MapReduce и теперь готовы с уверенностью справляться с задачами по обработке данных. Этот путь не только улучшил ваши технические навыки, но и расширил ваше представление о потенциале Hadoop MapReduce для обработки больших данных.



