
(一)yarn:负责资源调度
在hadoop1.x中,只有hdfs(负责存储)、mapreduce(负责计算),所有的计算相关全部放到mapreduce上,有以下两个进程:
1、jobtracker:整个计算程序的老大,负责资源调度,但是是随机调度的,监控程序运行的状态,还要启动运行程序,但jobtracker存在单点故障问题。
2、tasktracker:负责计算程序的执行,强行的把计算资源分成两部分:mapslot、reduceslot,map任务跑在mapslot上,reduce任务跑在reduceslot上。每一部分资源只能跑在对应的任务上。
缺陷:
(1)单点故障
(2)资源调度随机,造成资源浪费
(3)jobtracker的运行压力过大
鉴于以上缺陷,在hadoop2.x中,把hadoop1.x中的mapreduce分成两部分:
mapreduce:负责计算
yarn:专门负责资源调度
-----------------------------------------------------------------------------------------------
yarn(主从架构)
resourcemanager:整个资源调度的老大
(1)接收客户端的请求 该请求是运行程序的请求
(2)启动和监控MRAppMaster
(2)接收nodemanager的状态报告 nodemanager的资源状态和存活状态
(3)资源调度,整个计算程序的资源调度:决定运行资源和跑在哪个节点

nodemanager:负责真正的提供资源,运行计算程序
(1)接收resourcemanager的命令
(2)管理单个结点上的资源
(2)提供资源运行计算程序
(4)处理来自MRAppMaster的命令

启动计算和资源调度时的常见概念:
MRAppMaster:单个计算程序的老大,负责帮助计算程序向resourcemanager申请资源。
负责启动maptask和reducetask任务,监控maptask和reducetask的运行进度。类似于项目经理。
ASM:applicationsmanager 所有应用程序的管理者,负责调度应用程序。
container:抽象资源容器,封装着一定的cpu、io和网络等资源,是运行maptask和reducetask的运行资源单位,
1个split---->1maptask--->1container--->yarnchild
一个划分对应一个maptask,需要一个container资源,对应一个yarnchild进程。
scheduler:决定调度什么时候执行哪个计算程序(即job执行顺序)
调度器:
FIFO:先提交的程序先执行,后提交的程序后执行,通过内部维护一个队列实现
FATR:公平调度器,大家平分资源运行,通过内部维护多个队列实现,多个队列之间进行资源分配,程序之间平均分配资源
CAPICITY:按需进行资源配置,两个队列:第一个队列:60%,40%,在每个队列都是先进先出

--------------------------------------------------------------------------

-----------------------------hive的前面三节课程-----------------------

(二)yarn的资源调度过程,如下图:
1、hadoop向resourcemanager发送请求,resourcemanager接收到请求,把请求交给asm,asm做一系列检查,如果检查后没有异样,asm把请求转发给调度器(scheduler)。
2、scheduler为当前的job分配资源,随机的返回一个节点,比如nodemanager02。
3、请求到nodemanager02开启一个container。
4、开启mrappmaster。
5、mrappmaster向resourcemanager申请资源,为maptask和reducetask申请资源。
6、rm向mrappmaster返回当前有资源的节点,比如是01和03节点。返回节点的规则:优先返回有数据的节点,maptask任务执行个数由切片个数决定,切片---块---hdfs---某一个节点本地,前提条件是这个节点上有可用的资源,数据本地化:可以避免计算的时候数据的网络传输,提升计算性能。
7、去对应的节点上开启container和maptask任务。
先去01节点开启container,再在container中开启maptask任务,
去03节点开启container,再在container中开启maptask任务。
8、所有的maptask向rmappmaster汇报自己的运行状态和进度。
9、mrappmaster会在所有的maptask执行了80%的时候开启reducetask任务。
10、mrappmaster到对应的节点上开启reducetask
11、资源回收
12、mrappmaster向resourcemanager注销自己。


(三)job提交细节
真正在执行程序的时候,maptask reducetask每一个任务都在执行jar包,但是你的jar提交的时候只上传到一个节点上,maptask和reducetask运行的时候可能会运行在和jar包不同的节点上。但是程序并没有报错。
原因:肯定是maptask和reducetask运行的节点本地存在jar包,
如果存在jar包,该jar包存在哪个位置?
每次运行job的时候都会生成一个和job id相同的目录,
/tmp/hadoop-yarn/staging/hadoop/.staging
这个目录下存放的是运行程序的公共资源,公共资源指的是maptask和reducetask运行过程中通用的资源。比如jar包、配置文件。
这个公共资源包含3个核心文件:
jar包:job.jar 运行程序的jar包
job.split 切片信息 FileInputFormat.addPath() getSplits()
job.xml 配置文件信息 job运行的参数
这三个核心文件在程序运行过程中会被提交到hdfs 程序运行完成会被删除
程序运行过程中maptask运行节点和reducetask运行节点如果需要,则从hdfs拉取到本地。
(四)job提交过程:
1、客户端向resourcemanager(后面缩写为rm)提交job请求,
2、rm向客户端返回一个共享资源路径和applicationId
3、客户端将共享资源放在共享资源路径下,即job.jar job.split job.xml
4、客户端向rm发送资源放置成功的报告,并提交应用程序。
5、rm接收到客户端请求后会返回一个空闲的资源节点nodemanager02
6、rm在对应的资源节点上启动container
7、初始化job并生成一个job的作业簿,作业簿用于记录maptask和reducetask运行状态和进度等信息
8、启动mrappmaster
9、mrappmaster到共享资源路径下获取切片信息和配置文件的信息
10、mrappmaster向rm申请maptask和reducetask的资源,rm在处理mrappmaster资源申请时,优先满足maptask的资源
11、rm向mrappmaster返回空闲节点运行maptask和reducetask(按照数据本地优先的原则),比如是nodemanager03、nodemanager04
12、运行maptask的节点到共享资源下下载jar包和配置信息,下载到本地
13、mrappmaster到对应的节点上启动container,
14、maptask向mrappmaster汇报自身的运行状况和进度
15、mrappmaster启动reducetask,当maptask完成80%时,在启动之前,也要到共享资源下下载jar包和配置信息
16、时刻向mrappmaster保持通信
17、整个运行过程中,maptask运行完成,都会向mrappmaster注销自己
当所有的maptask和reducetasku都运行完成后,mrappmaster向resourcemanager注销自己进行资源回收。