[hadoop] hadoop之Mapreduce并行编程模型

 MapReduce入门

什么是mapreduce     

首先让我们来重温一下 hadoop 的四大组件:

  1. HDFS:分布式存储系统
  2. MapReduce:分布式计算系统
  3. YARN: hadoop 的资源调度系统
  4. Common: 以上三大组件的底层支撑组件,主要提供基础工具包和 RPC 框架等

Mapreduce 是一个分布式运算程序的编程框架,是用户开发“基于 hadoop 的数据分析 应用”的核心框架
Mapreduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的 分布式运算程序,并发运行在一个 hadoop 集群上
为什么需要mapreduce 

  1.  海量数据在单机上处理因为硬件资源限制,无法胜任
  2.  而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度
  3.  引入 MapReduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将 分布式计算中的复杂性交由框架来处理

 MapReduce工作机制

 

[hadoop] hadoop之Mapreduce并行编程模型_第1张图片

MapReduce的整个工作过程如上图所示,它包含如下4个独立的实体:

  实体一:客户端,用来提交MapReduce作业。

  实体二:JobTracker,用来协调作业的运行。

  实体三:TaskTracker,用来处理作业划分后的任务。

  实体四:HDFS,用来在其它实体间共享作业文件。

 

[hadoop] hadoop之Mapreduce并行编程模型_第2张图片

 

Hadoop中的MapReduce框架

 

            一个MapReduce作业通常会把输入的数据集切分为若干独立的数据块,由Map任务以完全并行的方式去处理它们。

           框架会对Map的输出先进行排序,然后把结果输入给Reduce任务。通常作业的输入和输出都会被存储在文件系统中,整个框架负责任务的调度和监控,以及重新执行已经关闭的任务。

 

           通常,MapReduce框架和分布式文件系统是运行在一组相同的节点上,也就是说,计算节点和存储节点通常都是在一起的。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使得整个集群的网络带宽被非常高效地利用。

 

MapReduce框架的组成

 

[hadoop] hadoop之Mapreduce并行编程模型_第3张图片

  (1)JobTracker

  JobTracker负责调度构成一个作业的所有任务,这些任务分布在不同的TaskTracker上(由上图的JobTracker可以看到2 assign map 和 3 assign reduce)。你可以将其理解为公司的项目经理,项目经理接受项目需求,并划分具体的任务给下面的开发工程师。

  (2)TaskTracker

  TaskTracker负责执行由JobTracker指派的任务,这里我们就可以将其理解为开发工程师,完成项目经理安排的开发任务即可。

MapReduce的输入输出

  MapReduce框架运转在键值对上,也就是说,框架把作业的输入看成是一组键值对,同样也产生一组键值对作为作业的输出,这两组键值对有可能是不同的。

  一个MapReduce作业的输入和输出类型如下图所示:可以看出在整个流程中,会有三组键值对类型的存在。

MapReduce的处理流程

  这里以WordCount单词计数为例,介绍map和reduce两个阶段需要进行哪些处理。单词计数主要完成的功能是:统计一系列文本文件中每个单词出现的次数,如图所示:

[hadoop] hadoop之Mapreduce并行编程模型_第4张图片

  (1)map任务处理

[hadoop] hadoop之Mapreduce并行编程模型_第5张图片

  (2)reduce任务处理

[hadoop] hadoop之Mapreduce并行编程模型_第6张图片

 

总结

一、MapReduce编程模型
思想:分成两个阶段,map阶段和reduce阶段;
map阶段将大的任务,切分成小任务,分散到不同的服务器中,并行的执行(减少每个服务器的计算负载,同时减少整体的计算时间);
reduce阶段,将map阶段的结果做一下汇总

map阶段的输入、输出都是以kv对的形式;输出结果写入map任务所在服务器的本地磁盘
reduce阶段的输入来自map阶段的输出;reduce的输出结果也是kv对,默认存储到HDFS中

二、MapReduce编程示例
1、写三个主要的代码
自定义的map类
    在map方法中,编写业务代码
自定义的reduce类
    在reduce方法中,编写业务代码
程序入口main
    编写程序入口
    
2、可以本地运行
3、集群运行

三、combiner
combiner的原理,map端本地聚合
其本质是一个reducer类

四、shuffle
shuffle主要指的map端的输出,然后如何传输到reduce task的过程

map端:
    输出是kv对,先写入环形缓冲区(100M),当达到80%后,缓冲区中的数据开始溢出写磁盘文件;
    溢出过程中,有以下几个操作:
    1、根据reduce个数对kv对做分区;
    2、每个分区中,根据kv对的key做排序;
    3、若有map端本地聚合combine,则对每个分区中,同组数据(默认指key相同的kv对)的values做聚合
    在溢出写的过程中,可以继续向环形缓冲区写入数据;但是若写入速度大于溢出写的速度,当100m占满后,暂停向环形缓冲区中写入的过程;只执行溢出写的过程;直到全部溢出写到磁盘,才恢复向缓冲区写入

    随着不断的溢出写磁盘文件,本地磁盘会生成多个溢出文件,在map task完成之前,溢出文件会被合并成一个已分区、已排序的输出文件

reduce端:
    reduce task会在每个map task运行完成后,获得map task输出中,属于自己的分区数据(许多kv对);
    数据先在reduce的jvm内存中,如果数据占空间变大,则合并后溢出写磁盘文件;若指定了combine,在合并时,运行它,减少写入磁盘的数据量。
    随着溢出文件的增多,会合并文件
    所有map task复制完成后,进入“合并阶段”;维持原顺序排序

    每组合并后的数据,调用一次reduce方法

 

 pdf文档:

https://download.csdn.net/download/weixin_40902527/11369222

你可能感兴趣的:(JAVA大数据)