知识学习——Hadoop MapReduce开发入门程序WordCount详解

来源:互联网 发布:复杂网络建模基本概念 编辑:程序博客网 时间:2024/05/20 06:39

##MapReduce计算模型
在Hadoop中,用于执行MapReduce任务的机器有两份角色:JobTracker和TaskTracker。JobTracker用于管理和调度工作,TaskTracker是用来执行工作的,一个Hadoop集群中只有一个JobTracker。
这里写图片描述

MapReduce Job

在Hadoop中,每个MapReduce任务会被初始化一个Job。每个Job可以分为Map阶段和Reduce阶段,可用Map和Reduce函数来表示。
Map函数接受一个<key,value>形式的输入,产生一个同样为<key,value>形式的中间输出,Hadoop将具有相同Key值的value集合到一起传递给Reduce函数,Reduce函数接受了一个如<key,list of value>形式的输入,Reduce对此进行处理,输出<key,value>形式的数据。

这里写图片描述

MapReduce入门程序WordCount

Map阶段

public class WordCount {//输入key类型,value类型,输出key类型,value类型    public static class WordCountMap extends            Mapper<LongWritable, Text, Text, IntWritable> {        //one表示单词出现一次        private final IntWritable one = new IntWritable(1);        //word用于存储切下的单词        private Text word = new Text();        public void map(LongWritable key, Text value, Context context)                throws IOException, InterruptedException {            //对输入的行切词            StringTokenizer token = new StringTokenizer(value.toString());            while (token.hasMoreTokens()) {                //切下的单词存入word                word.set(token.nextToken());                //用context将key,value输出                context.write(word, one);            }        }    }

Reduce阶段

    public static class WordCountReduce extends            Reducer<Text, IntWritable, Text, IntWritable> {        //输入key类型,value类型,输出key类型,value类型        //输入的格式是<key,list of value>形式        public void reduce(Text key, Iterable<IntWritable> values,                Context context) throws IOException, InterruptedException {            int sum = 0;            //计算value的和            for (IntWritable val : values) {                sum += val.get();            }            //用context将key,value输出            context.write(key, new IntWritable(sum));        }    }
    public static void main(String[] args) throws Exception {        //定义文件的输入输出地址        String[] paths = { "hdfs://master:9000/pxf/input/*.txt",            "hdfs://master:9000/pxf/output" };        //调用conf类来对MapReduce Job进行初始化并命名        Configuration conf = new Configuration();        Job job = new Job(conf, "wordcount");        job.setJarByClass(WordCount.class);        //设置Job输出结果<key,value>的中key和value数据类型        //因为结果是<单词,个数>,所以key设置为"Text"类型,相当于Java中String类型。        //Value设置为"IntWritable",相当于Java中的int类型        job.setOutputKeyClass(Text.class);        job.setOutputValueClass(IntWritable.class);        //设置Job处理的Map(拆分)、以及Reduce(合并)的相关处理类        job.setMapperClass(WordCountMap.class);        job.setReducerClass(WordCountReduce.class);        job.setInputFormatClass(TextInputFormat.class);        job.setOutputFormatClass(TextOutputFormat.class);        FileInputFormat.addInputPath(job, new Path(paths[0]));        FileOutputFormat.setOutputPath(job, new Path(paths[1]));        job.waitForCompletion(true);    }}
原创粉丝点击