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運行單機測試版。

相關文章
相關標籤/搜索