MapRedues(一) 概要&编程入门

MapRedues(一) 概要&编程入门@你宝爷

一、概述

1.1、基本概念

MapReduce是一个基于Hadoop集群的分布式计算编程框架,用户通过编写业务逻辑代码和自带默认组件结合成一个MR程序,程序提交任务给Hadoop集群或放在Hadoop集群上并发执行。

1.2、缺点

1.2.1、不适合流式计算

流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。

1.2.2、不适合DAG有向图计算

多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。

1.2.3、不适合实时计算

无法毫秒或者秒级内返回结果

1.3、优点

1.3.1、MapReduce 易于编程

它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得MapReduce编程变得非常流行。

1.3.2、良好的扩展性

当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。

1.3.3、高容错性

MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。

1.3.4、适合PB级以上海量数据的离线处理

可以实现上千台服务器集群并发工作,提供数据处理能力。

1.4、 MapReduce进程

一个完整的MapReduce程序在分布式运行时有三类实例进程:

(1)MrAppMaster:负责整个程序的过程调度及状态协调。

(2)MapTask:负责Map阶段的整个数据处理流程。

(3)ReduceTask:负责Reduce阶段的整个数据处理流程。

1.5、常用数据序列化类型

Java类型 Hadoop Writable类型
Boolean BooleanWritable
Byte ByteWritable
Integer IntWritable
Float FloatWritable
Long LongWritable
Double DoubleWritable
String Text
Map MapWritable
Array ArrayWritable

二、基础编程(使用IDEA工具编写)

代码_码云地址

输入数据_码云地址

2.0、编程步骤

1)实现Mapper类,重写map方法

2)实现Reducer类,重写reduce方法

3)编写程序入口类,创建Job对象,调用setXX方法赋值,创建输入输出路径。。。

2.1、word_count

需求:统计单词出现的次数

2.1.1、map方法
MyMapper.class
package com.mapreduce;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

//继承类泛型:<输入键,输入值,输出键,输出值>
//继承类泛型:<inKey,inValue,outKey,outValue>
//继承类泛型:<读取文件每一行文本的行偏移量,每行文本,单词名称,数字1>
public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
   
    //声明用于封装的,传递给上下文的输出对象
    Text outKey = new Text();
    IntWritable outValue = new IntWritable();

    @Override
    //方法作用:读取文件每一行文本,以空格分隔,输出单词,和数字1
    //参数列表:(输入键,输入值,传递对象)
    //参数列表:(inKey,inValue,Context)
    //参数列表:(读取文件每一行文本的行偏移量,每行文本,上下文对象)
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
   
        //1)将输入的value,转成字符串strValue
        String strValue = value.toString();
        //2)将strValue切割成多个words的字符串数组,以空格分隔
        String[] words = strValue.split(" ");
        //3)遍历words,得到每个word
        for (String word : words) {
   
            //4)将word封装成Text类型outKey
            outKey.set(word);
            //5)将数字1封装成IntWritable类型outValue
            outValue.set(1);
            //6)上下文对象context写入outKey和outValue
            context.write(outKey, outValue);
            //7)继续步骤4)5)6)遍历第一行文本内容,直到最后一个word
        }
        //8)至此完成第一行文本的传递,
        //9)以此类推:MapReduces框架会多次执行此方法,直到文件末行
    }
}
2.1.2、reduce方法
MyReducer.class
package com.mapreduce;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.Iterator;

//继承类泛型:<输入键,输入值,输出键,输出值>
//继承类泛型:<intKey,IntValue,outKey,outValue>
//继承类泛型:单词word,单词出现一次的数值1,单词,单词出现总数
public class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
   
    //声明用于封装的,传递给上下文的输出对象
    Text outKey = new Text();
    IntWritable outValue = new IntWritable();

    @Override
    //方法作用:接收map方法传递过来的参数,输出每个单词的出现次数
    //参数列表:(输入键,输入值,传递对象)
    //参数列表:(intKey,intValu,Context)
    //参数列表:(单词字符串,单词数字1的迭代器对象,用于传递输出结果的上下文对象Context)
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
   
        //定义int 型  sum变量,用于求单词出现的总次数
        int sum = 0;
        //1)获取迭代器对象counts,用于统计单词出现次数
        Iterator<IntWritable> counts = values.iterator();
        //2)遍历counts
        while (counts.hasNext()) {
   
            //3)获取每一个count,单词数值1
            IntWritable count = counts.next();
            //4)将数值count转换成int类型countNum
            int countNum = count.get();
            //5)循环执行3)4)5)累加countNum,得到单词出现总次数sum
            sum += countNum;
        }
        //6)封装sum为IntWritable类型,用于输出给上下文对象
        outValue.set(sum);
        //7)传递给上下文对象(单词,单词出现的总次数)
        context.write(key,outValue);
        //8)至此完成第一个单词的出现次数统计
        //9)MapReduces框架会多次执行此方法,直到所有单词word被统计完成
    }

}
2.1.3、程序入口
1)PC端测试:MyPCDriver.class
package com.mapreduce;
import org.apache.hadoop.conf.Configuration;
import org.apache
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值