書裏面一個簡單的例子是一年的最高溫度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運行單機測試版。