MapReduce 開篇練習之 統計單詞

Mapper

/***
 * hadoop 分佈式運算的編程框架
 * wordCount使用
 * 
 * KEYIN : 默認情況下,是mr框架所讀到的一行文本內容的起始偏移量,Long
 *  但是在hadoop中有自己的更精簡的序列化接口,所以不直接用Long,而用LongWritable
 * VALUEIN : 默認情況下,是mr框架所讀到的一行文本的內容,String.同上用Text
 *
 * KEYOUT : 用戶自定義邏輯處理完成之後輸出數據中的key,在此處是單詞,String.同上用Text
 * VALUEOUT : 用戶自定義邏輯處理完成之後輸出數據中的value,再次是單詞次數:Integer. 同上用IntWritable
 */
public class WordcountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{


    /***
     * map階段的業務邏輯就寫在自定義的map方法中
     * maptask會對每一行輸入數據調用一次我們自定義的map()方法
     *
     * @param key
     * @param value
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        //將maptask傳給我們的文本內容先轉換成String
        String line = value.toString();
        //根據空格將內容分成單詞
        String[] words = line.split(" ");

        //將單詞輸出爲<單詞,1>
        for (String word:words){
            //將單詞作爲key,將次數1作爲value. 以便後續的數據分發,可以根據單詞分發,以便於相同單詞會到相同的reduce task
            context.write(new Text(word),new IntWritable(1));
        }
    }
}

Reduce

/***
 *  KEYIN,VALUEIN : 對應Mapper輸出的KEYIN,VALUEIN類型對應
 *
 *  KEYOUT,VALUEOUT : 是自定義Reduce邏輯處理結果的輸出數據類型
 *  KEYOUT : 單詞
 *  VALUEOUT : 總次數
 */
public class WordcountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {


    /***
     *
     * @param key 一組相同單詞kv對的key
     * @param values
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {

        int count=0;
        for (IntWritable value:values){
            count+=value.get();
        }

        context.write(key,new IntWritable(count));
    }
}

Driver

/***
 * 相當於yarn的客戶端
 *  需要再此封裝我們的mr程序相關運行參數,指定jar包
 *  最後提交yarn
 */
public class WordcountDriver {

    //把業務邏輯相關的信息 描述成job對象
    public static void main(String [] args) throws IOException, ClassNotFoundException, InterruptedException {

        Configuration conf=new Configuration();
       /* conf.set("mapreduce.framework.name","yarn");
        conf.set("yarn.resoucemanager.hostname","SilverMoom");*/
        Job job=Job.getInstance(conf);

        //job.setJarByClass指定
        //指定本程序的jar包所在的本地路徑
        job.setJarByClass(WordcountDriver.class);

        //指定本業務job要使用的Mapper/Reducer業務類
        job.setMapperClass(WordcountMapper.class);
        job.setReducerClass(WordcountReducer.class);

        //指定mapper輸出數據kv類型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //指定最終輸出的數據的kv類型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //指定job源文件所在目錄
        FileInputFormat.setInputPaths(job,new Path(args[0]));

        //指定job的輸出結果目錄
        FileOutputFormat.setOutputPath(job,new Path(args[1]));

        //將job中配置的相關參數,以及job所用的java類所在的jar包,提交給yarn去運行
        /*job.submit();*/
        /*boolean result = job.waitForCompletion(true);
        System.exit(result?0:1);
*/      job.waitForCompletion(true);

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章