MapReduce Задача прыгает с 0% до 100% сразу без вывода - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь реализовать базовую Java-программу MapReduce, чтобы узнать максимальную температуру из заданного набора данных. Моя карта показывается как выполняющаяся пошаговыми шагами (0%, 10%, 18%, 27%, ... 100%), но моя задача «Редуктор» напрямую скачет с 0% до 100%. Вы заметили какие-либо проблемы с моим кодом ниже? Ожидаемый результат - код метеостанции и максимальная температура

Пример данных: Формат: WeatherStationCode, ГГГГММДД, ЭЛЕМЕНТ, ТЕМП. (Умноженный на 10), ....

CA004018880,20010101, TMIN, -220 ,,, C

MaxTemperatureMapper.java

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        String[] dataArray = value.toString().split(",");
        String stationCode = dataArray[0];
        String year = dataArray[1].substring(0, 4);
        String element = dataArray[2];
        int temperature;
        String qualityFlag = dataArray[5];
        String sourceFlag = dataArray[6];

        if(!dataArray[3].isEmpty()) {
            temperature = Integer.parseInt(dataArray[3]);
        } else {
            temperature = 0;
        }
        System.out.println(temperature + "-temperature|");  
        System.out.println(stationCode + "-stationCode|");  

        if(qualityFlag.isEmpty() && sourceFlag.isEmpty() && element.equalsIgnoreCase("TMAX")) {
            context.write(new Text(year), new IntWritable(temperature));
        }
    }

}

MaxTemperatureReducer.java

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int maxTemp = Integer.MIN_VALUE;
        for(IntWritable value: values) {
            maxTemp = Math.max(maxTemp, value.get());
        }
        context.write(new Text(key), new IntWritable(maxTemp));
    }
}

MaxYearTemperature.java

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class MaxYearTemperature {
    public static void main(String [] args) throws Exception {
        System.out.println(args);
        Configuration conf = new Configuration();
        String[] programArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if(programArgs.length != 2) {
            System.err.println("Usage: MaxTemp <in> <out>");
            System.exit(2);
        }
        Job job = Job.getInstance(conf, " Max Temp");
        job.setJarByClass(MaxYearTemperature.class);
        job.setMapperClass(MaxTemperatureMapper.class);
        job.setReducerClass(MaxTemperatureReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        FileInputFormat.addInputPath(job, new Path(programArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(programArgs[1]));

        //Submit the job and wait for it to finish
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

1 Ответ

0 голосов
/ 19 января 2019

Я смог понять это, на самом деле ничего общего с прыжками с 0-100%, Одно из значений массива, которые я читаю из массива split, всегда пусто в наборе данных, и элемент управления никогда не попадает в условие if для установки контекста. Как только я исправил, это начало работать. Спасибо за ваше время.

...