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

##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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值