Hadoop权威指南次日笔记

书里面一个简单的例子是一年的最高温度java

一、首先是map函数:有点疑问为啥map方法必须输入键和值网络

public class MaxTemperatureMapper extends MapReduceBase implements Mapper<LongWritable,Text,Text,IntWritable> {
    ......
    public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException{ ...... }
    ......
}

 Mapper是个泛型类,它有四个形参类型,分别指定了:app

输入键:LongWritable 它是该行文本对应的第一行文本的偏移量,对应java里的long类型ide

输入值:Text 它是一行文本相似于:1949。。。。。。。100011000.。。。每一行包含年份和温度值
函数

输出键:是年份,字符串oop

输出值:温度,相似一个java的int值测试

这里面LongWritable和IntWritable并无直接使用java里的数据类型,而是Hadoop作了封装了一套可供网络序列化传输的基本类型。spa


二、而后是Reduce函数:code

public class MaxTemperatureReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
    @override
    public void reduce (Text key, Iterable<IntWritable> values,Context context) throws IOException,InterruptedException {
        ......
        context.write(key,new IntWritable(maxValue));
    }
}

Reducer也有四个泛型形参,前面一对输入的形参必须对应map方法的输出形参,本业务的要求,输出结果也是一个文本和一个Int值。orm


三、负责运行MapReduce做业的job

public class MaxTemperature {
    public static void main(String[] args) throws Exception {
        .....
        Job job = new Job();
        job.setJarByClass(MaxTemperature.class);
        job.setJobName("Max Temperature");
        
        // 设定输入和输出路径,输出路径是Reducer文件的处理结果
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job,new Path(args[1]));
        
        // 指定map类型和reduce类型
        job.setMapperClass(MaxTemperatureMapper.class);
        job.setReducerClass(MaxTemperatureReducer.class);
        
        // map和reduce方法的输出类型,他们俩通常是相同的,若是不一样的话调用
        // setOutputKeyClass()和setOutputValueClass()控制map和reduce方法的输出类型
        // 输入的类型经过InputFormat控制,本例没设置由于使用的是默认的TextInputFormat文本输入格式
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        // waitForCompletion()方法提交做业并等待执行完成。true的意思是把做业进度输出到控制台
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

把代码打包成一个jar文件(Hadoop在集群上发布这个文件)不用指定jar文件的名称,在代码里Job对象SetJarByClass()方法中传递一个类便可,Hadoop利用类的路径来查找jar文件。若是输出的路径存在的话Hadoop会报错,避免覆盖掉别的文件。

明天是装hadoop运行单机测试版。

相关文章
相关标签/搜索