Hadoop MapReduce篇

前言

记录 在学习大数据技术中的学习笔记

目录

一、学习目标

二、MapReduce介绍

三、WordCount案例

a、Map阶段

b、Reduce阶段

c、组装Job

d、完整代码

e、pom文件内容

f、打jar包

四、 Hadoop MapReduce任务日志查看

 五、停止集群中正在运行的任务

六、MapReduce可以只包含Map


一、学习目标

掌握MapReduce的底层原理及应用开发

掌握YARN的使用

二、MapReduce介绍

MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题

MapReduce由两个阶段组成:Map和Reduce

MapReduce之Map阶段

1:框架会把输入文件(夹)划分为很多InputSplit,默认,每个HDFS的Block对应一个InputSplit。通过RecordReader类,把每个InputSplit解析成一个个<k1,v1>,k1记录的是偏移量,v1记录的是一行记录

2:框架调用Mapper类中的map(……)函数,map函数的输入是<k1,v1>,输出是<k2,v2>.一个InputSplit对应一个Map Task

3:框架对map函数输出的<k2,v2>进行分区。不同的分区中的<k2,v2>由不同的Rdeuce Task处理,默认只有一个分区

4:框架对每个分区中的数据,按照k2进行排序、分组。分组,指的是相同的k2的v2分成一组

5:在Map阶段,框架可以执行Combiner操作【可选】

6:框架会把Map Task输出的<k2,v2>写入Linux的磁盘文件

至此,整个Map阶段执行结束

MapRdeuce之reduce阶段

1:框架对多个Map Task的输出,按照不同的分区,通过网络Copy到不同的节点,这个过程称作Shuffle

2:框架对Reduce节点接收到的相同分区<k2,v2>数据进行合并、排序、分组

3:框架调用Reducer类中的reduce方法,输入<k2,{v2……}>,输出<k3,v3>.一个<k2,{v2……}>调用一次reduce函数

4:框架把Reduce的输出结果保存到HDFS中

reduce阶段结束

三、WordCount案例

Job = Map阶段 + Reduce阶段

a、Map阶段

    /**
     * map阶段
     */
//                                               k1的类型    v1的类型
    public static class MyMapper extends Mapper<LongWritable, Text,Text,LongWritable> {
//                                                                k2的类型 v2的类型
        Logger logger = LoggerFactory.getLogger(MyMapper.class);
    /**
     * 需要实现map函数
     * 这个map函数就是可以接收<k1,v1>,产生<k2,v2>
     */

    @Override
    protected void map(LongWritable k1, Text v1, Mapper<LongWritable, Text, Text, LongWritable>.Context context)
            throws IOException, InterruptedException {
        //k1 代表的是每一行的行首偏移量,v1代表的是每一行内容
        //对获取到的每一行数据进行切割,把单词切割出来
        String[] words = v1.toString().split(" ");
        //迭代切割出来的单词数据
        for(String word : words){
            //把迭代出来的单词封装成<k2,v2>的形式
            Text k2 = new Text(word);
            LongWritable v2 = new LongWritable(1L);
            //把<k2,v2>写出去
            context.write(k2,v2);
        }
    }
}

b、Reduce阶段

    /**
     * reduce阶段
     */
    public static class MyReduce extends Reducer<Text,LongWritable,Text,LongWritable>{
        Logger logger = LoggerFactory.getLogger(MyMapper.class);
        /**
         * 针对<k2,{v2.......}>的数据进行累加求和,并且最终把数据转化为<k3,v3>
         */
        @Override
        protected void reduce(Text k2, Iterable<LongWritable> v2s, Reducer<Text, LongWritable, Text, LongWritable>.Context context)
                throws IOException, InterruptedException {
            //创建一个sum变量,保存v2s
            long sum = 0L;
            //对v2s中的数据进行累加求和
            for (LongWritable v2 : v2s){
                sum = sum + v2.get();
            }
            //组装<k3,v3>
            Text k3 = k2;
            LongWritable v3 = new LongWritable(sum);
            //把结果写出去
            context.write(k3,v3);
        }
    }

c、组装Job

    /**
     * 组装job
     */
    public static void main(String[] args) {
        try {
            if(args.length!=2){
                //如果传递的参数不够,程序直接退出
                System.exit(100);
            }
            //指定Job需要的配置参数
            Configuration conf = new Configuration();
            //创建一个Job
            Job job = Job.getInstance(conf);

            //注意了:这一行必须设置,否则在集群中执行的时候是找不到WordCountJob这个类的
            job.setJa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值