浅析Hadoop(二)之MapReduce

浅析Hadoop(二)之MapReduce


1.经典的mapreduce工作原理
1)提交作业,job提交时,client向jobtracker请求一个新的作业id,检查作业的输出目录,如果没有指定或者已经存在,就会抛出异常。如果检查通过,开始计算作业的输入分片,将运行作业所需要资源复制到一个以作业id命名的目录下jobtracker的文件系统中,然后告知jobtracker作业准备执行。
2)当jobtracker接收到client对其submit方法的调用后,会将此调用放入一个内部队列中,由调度器进行调度,并对其进行初始化。初始化作业就是创建一个作业的对象用来封装任务和记录信息,以便跟踪任务的状态和进程。作业调度器首先从共享文件系统中获取client已经计算好的输入分片,并为每个分片创建一个map任务,并根据job配置的reduce个数来创建reduce任务。
3)由调度器分配任务给tasktracker之后,tasktracker通过从共享文件系统把作业的jar文件复制到本地,同时,tasktracker将应用程序所需要的全部文件从分布式缓存复制到本地磁盘,tasktracker为任务新建一个本地工作目录,并把jar文件中的内容解释到这个目录下,最后tasktracker新建一个taskRunner实例来运行该任务。
4)作业在执行过程中,Tasktracker每隔几秒向jobtracker发送一次“心跳”,tasktracker会将当前任务执行的状态发送给jobtracker,jobtracker将所有tasktracker发送的状态合并起来,产生一个表明所有运行作业及其所含任务状态的全局视图。Client通过查询jobtracker就可以看到当前作业执行的进度。

5)当jobtracker收到作业的最后一个任务执行结束的信息后,将作业状态设置为成功,然后从waitForCompletion方法返回,最后jobtracker清空作业的工作状态,并指示tasktracker清空所有的中间结果。


2.YARN的工作原理
     1)作业的提交和mapreduce1的机制是相同的
2)当ResourceManager接收到job的提交请求后,将请求发送给调度器,调度器会分配一个container容器,然后在ResourceManager和 NodeManager的管理下在容器中启动master进程。Application master是一个java应用程序,主类为MRAppMaster,由master对作业进行初始化。
3)Master为map和reduce任务向ResourceManager请求容器,请求信息中包括了map任务的数据本地化信息,输入分片所在的主机和相应的机架信息。调度器通过这些信息调度任务。
4)一旦ResourceManager为任务分配了容器,master就通过与nodemanager的通信来启动容器,在执行任务之前,先将任务所需要的jar文件,配置文件等等资源加载到本地。

5)任务每隔3秒向master汇报进度和状态,知道作业完成,application master清空作业的中间结果。


3.MapReduce框架和YARN框架的区别
1)mapreduce框架是为hadoop1.x的mapreduce作业量身定制的,其上只能运行mapreduce任务,而hadoop2.x中的YARN框架比经典的mapreduce框架更加具有一般性,mapreduce作业只是yarn应用的一种,比如spark也可以在yarn框架上运行

2)mapreduce1的jobtracker负责作业调度和任务进度监视,追踪任务,重启失败任务等等,因此主节点的配置就会成为集群的瓶颈。Yarn框架将这些职能划分为多个独立的实体,分别由ResourceManager中的调度器来负责作业的调度,由MRAppMaster负责为map和reduce任务向resource manager申请资源(container),并监控任务的进度和状态。


4.YARN框架各个实体的作用
       1)resource manager RM,负责所有应用程序计算资源的分配(container)
2)application master AM,负责相应的任务调度和协调
3)containers,每一个任务对应一个container,并且只能在container中执行
4)nodemanager,管理每个节点上的资源和任务,定期向RM汇报该节点的资源占用情况和各个container的状 态,接收和处理AM的任务自动和停止请求。



5.mapreduce任务的核心shuffle机制
      首先说一下什么叫做shuffle,将map端的输出作为输入传给reduce端称为shuffle。
下面说一下shuffle是如何工作的:
Map端:
Map任务接收输入分片,调用map方法,每个map任务都有一个环形内存缓冲区用于存储map的输出,默认 大小是100M,可以通过io.sort.mb属性来配置,一旦缓冲区的内容达到阈值,默认0.8 。一个后台线程便开始把 内容溢写到磁盘,在写磁盘之前,线程首先根据数据最终要传的reduce把数据进行分区,默认按照key的hash算 法。在溢写磁盘的过程中,map输出还是继续写入缓冲区,但如果溢写期间,缓冲区被写满,map会被阻塞直到 写磁盘过程完成。每次内存缓冲区达到阈值就会新建一个溢出文件。在任务完成之前将所有的溢出文件合并为一 个以分区且已排序的输出文件。
Reduce端:

Map任务的输出保存在nodemanager的本地磁盘,reduce任务需要集群上若干个map任务的输出结果,每 个map任务的完成时间不同,所以只要有一个map任务执行结束,reduce端就开始复制其输出文件,这就是r educe端的复制阶段。复制完所有的map输出结果文件之后,reduce任务进入merge阶段,这个阶段合并map输 出,维持其顺序排序,最后将数据输入到reduce函数中进行处理,输出结果写入hdfs中。


6.reduce是如何取得map的输出的?

只要有一个map任务执行结束,任务直接通知master,master就可以请求nodemanager启动reduce任务,reduce任务定期询问master,map输出结果与其节点位置的映射关系,从而得知map输出结果的位置,进而执行reduce任务。


7.对于shuffle过程的调优思路和配置方法。

在map端,通过避免多次溢出写磁盘过程来提高性能,一次是最佳性能,因为磁盘io对于性能的影响非常大,如果多次进行磁盘io操作,那么对于性能的影响显而易见。合理的设置io.sort.mb属性尽可能的减少溢写次数。该属性是配置map任务之后的环形内存缓冲区的大小,只要改缓冲区的大小足够存储map的输出结果,那么只进行一次溢写操作,就能获取最佳性能。
在reduce端,中间数据存入内存可以获取最佳的性能,默认是不可能的,因为所有的内存都是预留给reduce函数的,如果reduce函数的内存需求不大,设置将map输出结果全部存在内存中,就可以提升性能,具体配置查询官方文档。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章