书里面一个简单的例子是一年的最高温度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运行单机测试版。