权威指南中Maxtemperature

声明:此文针对刚开始学hadoop的新手,对java的一些API不熟悉的人来说,且程序是在单机模式下运行的

1:idea中新建一个java空项目

2:file->project structure配置程序所需要的一些jar包,如果不清楚需要哪些jar包的话,前期建议将所有jar包目录都导入,或者也可以选择在Libraries那里导入jar包也是一样的

3.(如果想要打包的话),可以配置Artifacts


4.在src目录下创建java类文件,也可以先创建包,然后在包下创建java文件,创建MaxTemperature,MaxTemperatureMapper,MaxTemperatureReducer这三个java文件,分别对应的是main函数,map函数,reduce函数

MaxTemperature函数:我这里的参数个数是4,后面会谈到我的程序这个参数为什么是4的

package com.hadoop.maxtemperature;


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;

public class MaxTemperature {
    public static void main(String[] args) throws Exception {
        if (args.length != 4) {
            System.err.println(args[0]+"  "+args[1]+"  "+args[2]+"  "+args[3]+"Usage: MaxTemperature ch程序错误<input path> <output path>");
            System.exit(-1);
        }
        Job job = new Job();
        job.setJarByClass(MaxTemperature.class);
        job.setJobName("Max temperature");

        FileInputFormat.addInputPath(job, new Path(args[2]));
        FileOutputFormat.setOutputPath(job, new Path(args[3]));

        job.setMapperClass(MaxTemperatureMapper.class);
        job.setReducerClass(MaxTemperatureReducer.class);

        job.setOutputKeyClass(Text.class);              //注1
        job.setOutputValueClass(IntWritable.class);

        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

MaxTemperatureMapper函数:

package com.hadoop.maxtemperature;

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> {  //注1
    private static final int MISSING = 9999;
    @Override
    public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        String year = line.substring(15, 19);
        int airTemperature;
        if (line.charAt(87) == '+') { // parseInt doesn't like leading plus signs
            airTemperature = Integer.parseInt(line.substring(88, 92));
        } else {
            airTemperature = Integer.parseInt(line.substring(87, 92));
        }
        String quality = line.substring(92, 93);
        if (airTemperature != MISSING && quality.matches("[01459]")) {
            context.write(new Text(year), new IntWritable(airTemperature));
        }
    }
}
MaxTemperatureReducer函数

package com.hadoop.maxtemperature;


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 maxValue = Integer.MIN_VALUE;
        for (IntWritable value : values) {
            maxValue = Math.max(maxValue, value.get());
        }
        context.write(key, new IntWritable(maxValue));
    }
}
5.Edit Configuration

6.选择Application


配置如下,Name就是你为你所运行这个程序所用服务器起的名字,Main class一栏,填写你所创建的MaxTemperature主函数所在的位置(相对于src目录下),如果你前面创建了包的话需要将包的名字也加上,像我图中一样的格式,没有创建包的话,直接填你写的,Program arguments填写你程序需要运行的一些文件所需的数据来源,以及数据保存的位置



第一个参数写你需要将你的jar包保存在哪个地方,第2个参数写程序放在哪里,如果前面没有创建package这里填/,第三个参数input/是指,数据来源是在该项目中的input文件提供,ouput是输出文件,在maxtemperature程序中,input文件中存放的是1901年与1902年的天气数据集,数据在网上都可以下载到,此处就不详细讲解了。

注:所以在前面的主函数中,参数个数是4,如果你不要jar包,路径,那么参数个数就是2,这里看个人喜好


配置和程序都弄好了,下面就可以运行了,运行好了就会出现

注:如果每次运行前需要将ouput目录删掉,才能重新运行


看一下我们的项目目录结构,是不是发现已经生成了一个ouput目录,查看ouput目录下的part-r-00000

再次强调,整个程序是在单机模式下运行的



猜你喜欢

转载自blog.csdn.net/qq_21003657/article/details/54668149