1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/weiwei02-WHadoop

Клонировать/Скачать
mapReduce.md 9.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 07.06.2025 13:10 09fcd4a

О MapReduce

MapReduce — это программная модель, используемая для обработки данных. Программы MapReduce по своей сути параллельны, поэтому крупномасштабные задачи анализа данных могут быть распределены на любой центр обработки данных, имеющий достаточное количество машин, что позволяет максимально использовать преимущества параллельных вычислений, предоставляемые Hadoop.

Анализ данных с использованием Hadoop

Процесс выполнения задач MapReduce состоит из двух этапов обработки: этапа map и этапа reduce. На каждом этапе используются пары ключ/значение как входные и выходные данные, тип которых выбирается программистом. Программист также должен написать две функции: функцию map и функцию reduce. Примеры взяты из книги "Hadoop: The Definitive Guide, 3rd Edition".#### 1. Создание Mapper-класса для поиска максимальной температуры в пакете com.hadoopbook.ch02; импорт org.apache.hadoop.io.IntWritable; импорт org.apache.hadoop.io.LongWritable; импорт org.apache.hadoop.io.Text; импорт org.apache.hadoop.mapreduce.Mapper; импорт java.io.IOException; /** * @author WangWeiwei * @version OnClickListener 1.0 * @sine 17-2-4 * Маппер для поиска максимальной температуры */ публичный класс MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> { прайвет статический финал инт MISSING = 9999; @Переопределить защищенный void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { строка line = value. toString(); строка year = line. substring(15, 19); инт airTemperature; если (line. charAt(87) == '+') { // parseInt не любит ведущие знаки плюса airTemperature = Integer. parseInt(line. substring(88, 92)); } иначе { airTemperature = Integer. parseInt(line. substring(87, 92)); } строка quality = line. substring(92, 93); если (airTemperature != MISSING && quality. matches("[01459]")) { context. write(new Text(year), new IntWritable(airTemperature)); } } публичный MaxTemperatureMapper() { супер(); } } Этот маппер является параметризованным типом, имеющим четыре параметра, которые определяют типы ключей и значений для входных и выходных данных функции map. Hadoop предоставляет набор оптимизированных типов для сетевой сериализации, вместо использования встроенных типов Java. Эти типы находятся в пакете org.apache.hadoop.io. Метод map() принимает ключ и значение в качестве входных данных и использует контекст для записи выходных данных.

2. Маппер для поиска максимальной температуры

 Аналогично, используем Reducer для определения функции reduce.
       пакет com. hadoopbook. ch02;
       импорт org. apache. hadoop. io. IntWritable;
      импорт org. apache. hadoop. io. Text;
      импорт org. apache. hadoop. mapreduce. Reducer;
       импорт java. io. IOException;
       /**
       * @author WangWeiwei
       * @version OnClickListener
       * @sine 17-2-4
       * Редьюсер для поиска максимальной температуры
       */
      публичный класс MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        public MaxTemperatureReducer() {
             super();
         }
          @Override
         protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
             int maxValue = Integer. MAX_VALUE;
             for (IntWritable value : values){
                 maxValue = Math. max(maxValue, value. get());
             }
             context. write(key, new IntWritable(maxValue));
         }
    }
```Примечание: В исходном коде `Integer.MIN_VALUE` был заменен на `Integer.MAX_VALUE`, что не соответствует логике поиска максимального значения. Вероятно, это ошибка в исходном коде, и правильным было бы оставить `Integer.MIN_VALUE`. Однако, согласно правилам перевода, я оставляю исходное форматирование и разметку без изменений, за исключением перевода текста, если бы он был присутствовать. Также функция reduce имеет четыре формы параметров типа для указания типов входных и выходных данных. Типы входных данных функции reduce должны соответствовать типам выходных данных функции map: то есть типам TEXT и IntWritable.

#### 3. MapReduce задача
Задача определяется объектом Job, который используется в этом приложении для поиска максимальной температуры в наборе данных по погоде.
```java
package com.hadoopbook.ch02;
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;
``````markdown
Объект Job определяет параметры выполнения задачи. Мы можем использовать его для контроля всего процесса выполнения задачи. Когда мы запускаем эту задачу на кластере Hadoop, нам нужно упаковать её в JAR-файл (Hadoop распространяет этот файл на кластере). Не обязательно явно указывать имя JAR-файла; достаточно передать класс в метод setJarByClass объекта Job, и Hadoop использует этот класс для поиска JAR-файла, содержащего его. После создания объекта Job необходимо указать пути к входным и выходным данным. Для этого вызывается статический метод addInputPath() класса FileInputFormat. Определяет путь для входных данных, который может быть либо отдельным файлом, либо директорией (в этом случае все файлы внутри директории будут использованы как входные данные) или набором файлов, соответствующим определённому шаблону.
```Из названия функции следует, что метод addInputPath() можно вызывать несколько раз. Метод setOutputPath() из класса FileOutFormat используется для задания пути к выходным данным, который может быть только один. Этот метод задаёт директорию, в которую будут записаны выходные файлы функции reduce. Перед запуском задания эта директория не должна существовать, иначе Hadoop выдаст ошибку и отклонит выполнение задания. Эта мера предосторожности направлена на предотвращение потери данных (длительное выполнение задания, результат которого был бы случайно перезаписан, было бы крайне неприятно).

Затем методами setMapperClass() и setReducerClass() задаются типы map и reduce. Методами setOutputKeyClass() и setOutputValueClass() управляются типы выходных данных map и reduce.

После задания классов, определяющих map и reduce функции, можно запустить задание. Метод waitForCompletion() в классе job возвращает логическое значение.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/weiwei02-WHadoop.git
git@api.gitlife.ru:oschina-mirror/weiwei02-WHadoop.git
oschina-mirror
weiwei02-WHadoop
weiwei02-WHadoop
master