MapReduce:口述过程原理

MapReduce是一种并行可扩展计算模型,并且有较好的容错性,主要解决海量离线数据的批处理。实现下面目标:

易于编程

良好的扩展性

 高容错性

MapReduce有哪些角色?各自的作用是什么?

MapReduce由JobTracker和TaskTracker组成。JobTracker负责资源管理和作业控制,TaskTracker负责任务的运行。

程序执行流程图如下:

 

 

(1) 开发人员编写好MapReduce program,将程序打包运行。

(2) JobClient向JobTracker申请可用Job,JobTracker返回JobClient一个可用Job ID。

(3) JobClient得到Job ID后,将运行Job所需要的资源拷贝到共享文件系统HDFS中。

(4) 资源准备完备后,JobClient向JobTracker提交Job。

(5) JobTracker收到提交的Job后,初始化Job。

(6) 初始化完成后,JobTracker从HDFS中获取输入splits(作业可以该启动多少Mapper任务)。

(第6步骤 详见以下:MapReduce工作原理

(7) 与此同时,TaskTracker不断地向JobTracker汇报心跳信息,并且返回要执行的任务。

(8) TaskTracker得到JobTracker分配(尽量满足数据本地化)的任务后,向HDFS获取Job资源(若数据是本地的,不需拷贝数据)。

(9) 获取资源后,TaskTracker会开启JVM子进程运行任务

注:

(3)中资源具体指什么?主要包含:

    ● 程序jar包、作业配置文件xml

    ● 输入划分信息,决定作业该启动多少个map任务

    ● 本地文件,包含依赖的第三方jar包(-libjars)、依赖的归档文件(-archives)和普通文件(-files),如果已经上传,则不需上传

 

对 MapReduce 做一个总结。MapReduce 将 作业的整个运行过程分为两个阶段:Map 阶段和Reduce 阶段。     

1、Map 阶段    

Map 阶段是由一定数量的 Map Task 组成。这些 Map Task 可以同时运行。

每个 Map Task又是由以下三个部分组成:

       

1) 对输入数据格式进行解析的一个组件:InputFormat。因为不同的数据可能存储的数据格式不一样,这就需要有一个 InputFormat 组件来解析这些数据的存放格式。默认情况下,它提供了一个 TextInputFormat 来解释数据格式。TextInputFormat 就是我们前面提到的文本文件输入格式,它会将文件的每一行解释成(key,value),key代表每行偏移量,value代表每行数据内容(如 wordcount例子 1-hello java  2-hello c++)。 通常情况我们不需要自定义 InputFormat,因为 MapReduce 提供了很多种InputFormat的实现,我们根据不同的数据格式,选择不同的 InputFormat 来解释就可以了。          

2)输入数据处理:Mapper。这个 Mapper 是必须要实现的,因为根据不同的业务对数据有不同的处理。(见下详述)  

MapReduce 将 作业的整个运行过程分为两个阶段:Map 阶段和Reduce 阶段。   

3)数据分组:Partitioner。Mapper 数据处理之后输出之前,输出key会经过 Partitioner 分组或者分桶选择不同的reduce。默认的情况下,Partitioner 会对 map 输出的key进行hash取模,比如有6个Reduce Task,它就是模(mod)6,如果key的hash值为0,就选择第0个 Reduce Task,如果key的hash值为1,就选择第一个 Reduce Task。这样不同的 map 对相同单词key,它的 hash 值取模是一样的,所以会交给同一个 reduce 来处理。    

 2、Reduce 阶段   

1) 数据运程拷贝。Reduce Task 要运程拷贝每个 map 处理的结果,从每个 map 中读取一部分结果。每个 Reduce Task 拷贝哪些数据,是由上面 Partitioner 决定的。        

2) 数据按照key排序。Reduce Task 读取完数据后,要按照key进行排序。按照key排序后,相同的key被分到一组,交给同一个Reduce Task 处理。    

3) 数据处理:Reducer。以WordCount为例,相同的单词key分到一组,交个同一个Reducer处理,这样就实现了对每个单词的词频统计。    

4) 数据输出格式:OutputFormat。Reducer 统计的结果,将按照 OutputFormat 格式输出。默认情况下的输出格式为 TextOutputFormat,以WordCount为例,这里的key为单词,value为词频数。    

从上图以及MapReduce 的作业的整个运行过程我们可以看出存在以下问题:    

1)Map Task输出的数据量(即磁盘IO)大。Map Task 将输出的数据写到本地磁盘,它输出的数据量越多,它写入磁盘的数据量就越大,那么开销就越大,速度就越慢。    

2)Reduce-Map网络传输的数据量(网络IO)大,浪费了大量的网络资源。    

3)容易造成负载不均。

 

Mapper:从HDFS读取数据

1、问题:读取数据产生多少个Mapper?   

Mapper数据过大的话,会产生大量的小文件,由于Mapper是基于虚拟机的,过多的Mapper创建和初始化及关闭虚拟机都会消耗大量的硬件资源;     Mapper数太小,并发度过小,Job执行时间过长,无法充分利用分布式硬件资源;

2、Mapper数量由什么决定? 

(1)输入文件数目  

(2)输入文件的大小  

(3)配置参数

参考:https://blog.csdn.net/aijiudu/article/details/72353510

 

 

 

MapReduce工作原理

工作原理图如下:

MapReduce流程:input->Splitting->Mapping->Shuffling->Reducing-> result 

 

MapReduce 将 作业的整个运行过程分为两个阶段:Map 阶段和Reduce 阶段。 

map task

(注:map task执行的时候,数据的来源是HDFS上的block,在MapReduce概念中,读取的是split,split和block是对应的。

程序会根据InputFormat将输入文件分割成splits,每个split会作为一个map task的输入,每个map task会有一个内存缓冲区,

输入数据经过map阶段处理后的中间结果会写入内存缓冲区,并且决定数据写入到哪个partitioner,当写入的数据到达内存缓冲

区的的阀值(默认是0.8),会启动一个线程将内存中的数据溢写入磁盘,同时不影响map中间结果继续写入缓冲区。在溢写过程中,MapReduce框架会对key进行排序,如果中间结果比较大,会形成多个溢写文件,最后的缓冲区数据也会全部溢写入磁盘形成一个溢写文件(最少有一个溢写文件),如果是多个溢写文件,则最后合并所有的溢写文件为一个文件。

reduce task

当所有的map task完成后,每个map task会形成一个最终文件,并且该文件按区划分。reduce任务启动之前,一个map task完成后,就会启动线程来拉取map结果数据到相应的reduce task,不断地合并数据,为reduce的数据输入做准备,当所有的map task完成后,数据也拉取合并完毕后,reduce task 启动,最终将输出结果存入HDFS上。

 

 

 

 

 

MapReduce中Shuffle过程

Shuffle的过程:描述数据从map task输出到reduce task输入的这段过程。

我们对Shuffle过程的期望是:

完整地从map task端拉取数据到reduce task端 

跨界点拉取数据时,尽量减少对带宽的不必要消耗

减小磁盘IO对task执行的影响

 

先看map端:

 

split被送入map task后,程序库决定数据结果数据属于哪个partitioner,写入到内存缓冲区,到达阀值,开启溢写过程,进行key排序,

如果有combiner步骤,则会对相同的key做归并处理,最终多个溢写文件合并为一个文件。

 

再看reduce端:

 

多个map task形成的最终文件的对应partitioner会被对应的reduce task拉取至内存缓冲区,对可能形成多个溢写文件合并,最终

作为resuce task的数据输入 。

 

MapReduce编程主要组件

InputFormat类:分割成多个splits和每行怎么解析。   

Mapper类:对输入的每对<key,value>生成中间结果。

Combiner类:在map端,对相同的key进行合并。

Partitioner类:在shuffle过程中,将按照key值将中间结果分为R份,每一份都由一个reduce去完成。

Reducer类:对所有的map中间结果,进行合并。

OutputFormat类:负责输出结果格式。

编程框架如下:

 

 

针对MapReduce的缺点,YARN解决了什么?

MapReduce有以下缺点:

★ JobTracker挂掉,整个作业挂掉,存在单点故障

★ JobTracker既负责资源管理又负责作业控制,当作业增多时,JobTracker内存是扩展的瓶颈

★ map task全部完成后才能执行reduce task,造成资源空闲浪费

YARN设计考虑以上缺点,对MapReduce重新设计:

★ 将JobTracker职责分离,ResouceManager全局资源管理,ApplicationMaster管理作业的调度

★ 对ResouceManager做了HA设计

★ 设计了更细粒度的抽象资源容器Container

 

扩展:在Yarn中,每个application都有一个Application Master进程,它是Appliaction启动的第一个容器,它负责从ResourceManager中申请资源,分配资源,同时通知NodeManager来为Application启动container,Application Master避免了需要一个活动的client来维持,启动Applicatin的client可以随时退出,而由Yarn管理的进程继续在集群中运行。

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值