MapReduce初识总结

MapReduce是一个分布式计算框架,源自Google的论文,适用于大规模数据处理场景。其核心思想是分而治之,通过Map和Reduce实现数据的并行处理。MapReduce具有易于编程、可扩展性和高容错性的优点,但不适用于实时计算、流式计算和DAG计算。本文深入介绍了MapReduce的设计思想、优缺点、执行流程以及编程规范,包括Mapper和Reducer的实现细节,并提供了一个WordCount案例。
摘要由CSDN通过智能技术生成

觉得有帮助的,请多多支持博主,点赞关注哦~

MapReduce初识

1、MapReduce简介

1.1、定义

  • MapReduce(MR) 是一个分布式计算(运算程序的编程)框架,是用户开发“基于 Hadoop 的数据分析应用”的核心框架。
  • MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 Hadoop 集群上。
  • 它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务。
  • 核心思想就是分而治之(并发)

1.2、起源

源于Google在大数据方面的三篇论文之一,Map-Reduce

1.3、适用场景

适用于大规模数据处理场景

  • 每个节点处理存储在该节点的数据

每个job包含Map和Reduce两部分

2、MapReduce的设计思想

起因由来:MR处理的数据量大、MR所在的集群服务节点多

  1. 分而治之(split切片):如何实现?需要一种简化并且支持并行计算的编程模型。
  2. 构建抽象模型:Map和Reduce
    好处:使开发人员专注于实现Mapper和Reducer函数。
  3. 在第二点的基础上,采用该模型的好处:
    1.隐藏MapReduce系统底层的细节
    2.开发人员专注于业务逻辑实现

3、MapReduce的优缺点

3.1、MR优点

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

  2. 可扩展性
    集群可以不停止的情况下,增删节点(refreshNodes)。增:slaves;删:exclude。
    甚至当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力

  3. 高容错性
    主要体现在了hadoop具有副本机制。
    Hadoop内部解决一台机器挂了的问题,会直接将计算任务转移到另一个副本节点上运行,不会使任务失败,提高容错性。

  4. 高吞吐量
    单次处理的数据量大,所在的集群的服务节点多。
    适合 PB 级以上海量数据的离线处理

    ps:离线:基于磁盘IO;实时:基于内存

3.2、MR缺点

MapReduce 不擅长做实时计算、流式计算、DAG(有向图)计算。

  1. 不适合实时计算:MapReduce 无法像 Mysql 一样,在毫秒或者秒级内返回结果。
  2. 不适合流式计算:流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
  3. 不适合DAG(有向图)计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一
    个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业
    的输出结果都会写入到磁盘,会造成大量的磁盘 IO,导致性能非常的低下。

4、MapReduce程序运行的实例进程

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

  1. MrAppMaster:负责整个程序的过程调度及状态协调
  2. MapTask:负责 map 阶段的整个数据处理流程。
  3. ReduceTask:负责 reduce 阶段的整个数据处理流程。

5、MapReduce编程核心思想

在这里插入图片描述

  1. 分布式的运算程序往往需要分成至少 2 个阶段。
  2. 第一个阶段的 maptask 并发实例,完全并行运行,互不相干。
  3. 第二个阶段的 reduce task 并发实例互不相干,但是他们的数据依赖于上一个阶段的所有maptask 并发实例的输出。
  4. MapReduce 编程模型只能包含一个 map 阶段和一个 reduce 阶段,如果用户的业务逻辑非常复杂,那就只能多个 mapreduce 程序,串行运行。
  5. 扩展,其实map和reduce中间又有这shuffle阶段

6、MapReduce完整执行流程

在这里插入图片描述

7、MapReduce程序

7.1、MapReduce程序组成

在这里插入图片描述

注意:
1)数据的来源:data input(存储在分布式系统hdfs)
2)Mapper:实现并行的运算
3)Reducer:实现最终结果的规约
4)数据的结果:data output(存储在hdfs)
数据如何导出集群:sqoop

7.2、MapReduce实现WordCount流程

在这里插入图片描述
在这里插入图片描述

8、MapReduce编程规范

用户编写的程序至少要分成三个部分:

  1. Mapper
  2. Reducer
  3. Driver

8.1、Mapper类

8.1.1、自定义Mapper关键点
  1. 用户自定义的 Mapper 要继承自己的父类
  2. 输入数据是(key-value)对的形式
  3. Mapper 中的业务逻辑写在 map()方法中
  4. 输出数据是(key-value)对的形式
  5. Mapper中的业务逻辑写在map()方法中,map方法每行调用1次
    map()方法(maptask 进程)对每一个<K,V>调用一次
8.1.2、Mapper主要方法
  1. void setup(Context context)
    org.apache.hadoop.mapreduce.Mapper.Context
    每个mapper的setup方法,只执行一次,进行初始化的操作
    主要是用作对象的初始化,表头数据的输出等等,是在计算之前做的解释准备等等。
  2. void map(KEY key,VALUE value,Context context)
    为输入分片中的每个键/值对调用一次。
    必须执行的主要方法,接收KV,排序处理一次,再context传给reducer。
  3. void cleanup(Context context)
    与setup对应,结束时输出的东西。如,sout(“执行完毕。。”);
  4. void run(Context context)
    可通过重写该方法对Mapper进行更完整控制。
8.1.3、自定义Mapper的核心代码

mapper代码示例:

//自定义的Mapper
static class CustomerMapper extends Mapper<Object, Text,Text, IntWritable>{
   
    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
   
        //1)得到当前行的内容   value: a,b,hello,aaa
        String line =value.toString();
        //2)按照 , 进行分割
        String [] words =line.split(",");
        //3)输出
        System.out.println("--------------------------------------------->Map函数输出。。。");
        for(String word :words){
   
            context.write(new Text(word),new IntWritable(1));

            System.out.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值