Hadoop之mapreduce

JobTracker和TaskTracker

一 概述:

(1)Hadoop MapReduce采用Master/Slave结构。
*Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker。
*Slave:负责任务的执行和任务状态的回报,即MapReduce中的TaskTracker。

二 JobTracker剖析:

概述:
JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。

(2)JobTracker的主要功能:
1.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。
*最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。
2.资源管理。

三 TaskTracker剖析:

(1) TaskTracker概述:
TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。
(2)TaskTracker的功能:
1.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:
*机器级别信息:节点健康情况、资源使用情况等。
*任务级别信息:任务执行进度、任务运行状态等。
2.执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。

obTracker 对应于 NameNode
TaskTracker 对应于 DataNode
DataNode 和NameNode 是针对数据存放来而言的
JobTracker和TaskTracker是对于MapReduce执行而言的

mapreduce中几个主要概念,mapreduce整体上可以分为这么几条执行线索:
jobclient,JobTracker与TaskTracker。
1、JobClient会在用户端通过JobClient类将应用已经配置参数打包成jar文件存储到hdfs,
并把路径提交到Jobtracker,然后由JobTracker创建每一个Task(即MapTask和ReduceTask)
并将它们分发到各个TaskTracker服务中去执行
2、JobTracker是一个master服务,软件启动之后JobTracker接收Job,负责调度Job的每一个子任务task运行于TaskTracker上,
并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker部署在单独的机器上。
3、TaskTracker是运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。
TaskTracker都需要运行在HDFS的DataNode上.

Hadoop之mapreduce
原理图的解释的可以分为以下几个部分

1、客户端提交一个mapreduce的jar包给JobClient

2、JocClient通过RPC和JobTracker进行通信,返回一个存放jar包的地址(HDFS)

3、JobClient将jar包写入到HDFS当中(path=hdfs上的地址(这个地址是有第二步的JobTracker返回的)+JobId)

将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门  为该作业创建的文件夹中。文件夹名为该作业的Job ID。JAR文件默认会有10个副本(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个  作业启动多少个map任务等信息

4、开始提交任务(任务的描述信息:包括jobid,jar存放的位置,配置信息等等)

JobClient调用JobTracker的submitJob()方法提交任务

5、JobTracker进行初始化任务

JobTracker会把提交的作业放在一个内部队列中,交由作业调度器来进行调度,任务的初始化包括创建一个表示运行的作业的对象——封装任务和记录信息,以便跟踪  任务的状态和信息。

6、读取HDFS上要处理的文件,开始计算输入分片,每一个分片对应一个MapperTask

当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个切片启动一个MapperTask任务

7、TaskTracker通过心跳机制领取任务(任务的描述信息)

map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的的TaskTracker上。同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化。TaskTracker每隔一段时间会给 JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户

8、下载所需的jar,配置文件

9、TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)

map函数端的执行过程:

a:每个输入分片会让一个map任务处理,默认情况下,以HDFS的一个快的大小为一个分片,map输出的结果暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100M,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort。spill。percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区的数据写入这个文件

b:在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据,这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分配到很少数据,其实分区就是对数据进行hash的过程,然后对每个分区中的数据进行排序,如果此时设置了Combiner,将排序后的结果进行Combiner操作,这样做的目的是让尽可能少的数据写入到磁盘。

c:当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并,合并的过程会不断的进行排序和Combiner操作,目的有两个:1、尽量减少每次写入磁盘的数据量,2、尽量减少下一次复制阶段网络传输的数据量,最后合并成一个已分区已排序的文件,为了减少网络传输的数据量,可以将数据进行雅俗,只要将mapred.compress.map.out设置为true就行了

d:将分区中的数据拷贝给相对应的reduce任务,有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和JobTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就ok了哦。

reduce函数端执行过程

a:reduce会收到不同map任务传来的数据,并且每个map传来的数据都是有序的,如果reduce端接受的数据量相当小,则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,表示用作此用途的堆空间的百分比),如果数据量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merge.buffer.percent决定),则对数据合并后溢写到磁盘中。

b:伴随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间,其实不管在map端还是reduce端,MapReduce都是反复的执行排序,合并操作,

c:合并的过程中会产生许多的中间文件(写入磁盘了),但MaoReduce会让写入磁盘的数据尽可能的少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。

10、将结果写入到HDFS当中

hadoop里面的MapReduce和yarn的运行原理

hadoop 1.xx与hadoop2.xx的区别特别大。特别是HDFS和mapreduce都有了很大的改变。hadoop2.xx具有高容错,有效的减少了由于单点故障所产生的影响,并且可用性和速度都有很大的提升。
hadoop2.xx的主要变更:
1)、HDFS的NameNode 可以以集群的方式进行部署,这就是高可用集群,即HA-hadoop集群。
2)、MapReduce里面的JobTracker中的资源管理及任务生命周期管理(包括定时触发及监控),拆分成两个独立的组件,并更名为YARN(Yet Another Resource Negotiator)。
下面就详细介绍一下:
一、hadoop 1.xx中的MapReduce
hadoop1的MapReduce的执行图如下:
Hadoop之mapreduce
多个客户端向主机发送请求,JobTracker(资源和任务的调度管理)将任务和资源分配给从机里面的TaskTracker里面,同时TaskTracker过了一定的时间会发送一个心跳,来反映是否活着。这就造成了JobTracker的压力过大。
出现的问题:
1.单节点,主要时指JobTracker进程
2.节点压力大
3.只能运行MapReduce框架
Hadoop之mapreduce

二、yarn架构

yarn:Yet Another Resource Negotiator另一种资源管理。
主要概念是将资源管理的功能和作业调度/监控分离成独立的守护进程。主要有全局的ResourceManager和每个应用程序的ApplicationMaster进程,一个应用程序可以是一个单一的进程和多进程的新组件。
ResourceManager和NodeManager构成了计算机数据框架。
ResourceManager是在系统中的所有应用程序中仲裁资源的最终权威。NodeManager是每台机器框架代理负责容器,监测他们的资源使用(cpu、内存、磁盘、网络)和报告同一个的ResourceManager /Scheduler调度程序。
实际上,每个应用程序的ApplicationMaster是一个特定于框架的库,它的任务是与来自ResourceManager的资源进行协商,并与NodeManager(s)一起工作,以执行和监视任务。
Hadoop之mapreduce

yarn架构:

master/slaver结构(主从结构):一个主机(ResourceManager)多个从机(NodeManager)
ResourceManager作用:
在整个集群中只有一个ResourceManager处于工作状态(即使在高可用的Hadoop集群里面),负责资源的统一管理和调度。
1)处理客户端发送的请求(启动或者杀死应用程序)
2)启动/监控ApplicationMaster,ApplicationMaster挂了,RM将会在另一个节点上启动AM
3)RM要监控NodeManager
4)整个集群资源的分配和调用
ResourceManager有两个主要组件:Scheduler(调度程序)和ApplicationsManager。
Scheduler调度器负责将资源分配给各种运行的应用程序,这些应用程序受到熟悉的容量、队列等约束。调度器是纯粹的调度器,因为它没有对应用程序的状态进行监视或跟踪。此外它不能保证重新启动失败或者是由于应用程序失败或硬件故障的任务。
调度器根据应用程序的资源需求执行调度功能;它基于一个资源容器的抽象概念,它包含了诸如内存、cpu、磁盘、网络等元素。
调度器有一个可插拔的策略,负责在各种队列、应用程序等之间划分集群资源。
ApplicationsManager负责接受工作提交,协商第一个容器执行应用程序特定的ApplicationMaster,并提供重新启动ApplicationMaster容器失败的服务.
每个应用程序的ApplicationMaster有责任从调度程序中协商适当的资源容器,跟踪它们的状态并监控进度。
hadoop2.xx里面的MapReduce保持API兼容性与以前的hadoop1.xx稳定版本。
这意味着所有MapReduce作业都应该在仅仅重新编译的情况下,在YARN上面保持不变.
YARN还支持通过预订系统进行资源保留的概念,该组件允许用户指定资源的时间过长和时间限制(例如:,最后期限),以及储备资源以确保可以预见的重要工作的执行。
保留区系统跟踪资源的超时时间,执行预订控制,并动态地指示底层调度程序以确保保留已满。