Hadoop v2(Yarn) 调度分析 (1) JobClient 的提交过程

ResourceManager:

    ApplicationManager:

         负责为AppMaster申请Container (资源),并监控AppMaster的failed

    ResourceScheduler:

         负责多个application的资源分配,调度Container

NodeManager:

      负责启动和监控Container

ApplicationMaster:

      负责监控Task (Map或Reduce) 的执行情况,为Task向RM申请Container,记录Task的history,在Task出问题的时候回放history


注: 本图作者 [email protected]; weibo http://weibo.com/u/2249325320


JobClient 的提交过程:

1.  JobClient通过submitJob提交Job给RM(ResourceManager),RM为AM(AppMaster)分配Container,并通知NM(NodeManager)启动Container。

源码跟踪:

1). JobSubmitter.java:    SubmitJobInternal()    ->    YARNRunner.java : submitJob()   ->    ClientRMProtocolPBClientImpl.java:  resMgrDelegate.submitApplication()   ->    proxy.submitApplication() (protobuffer)

之后通过 RPC 发送命令,(还包括很多其他的信息)内容如下: 

....

JAVA_HOME/bin/java -Dlog4j.configuration=container-log4j.properties -Dyarn.app.mapreduce.container.log.dir= 

-Dyarn.app.mapreduce.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Xmx1024m 

org.apache.hadoop.mapreduce.v2.app.MRAppMaster 1>/stdout 2>/stderr 

....

在这些信息中还包含着job.jar和job.xml的内容,在此时Master会将用户提交的MapReduce任务共享到HDFS上,给各个Slave Node 分享(未验证)。


2). NM的dispatcher接收到Event后分派给ContainerLauncher,ContainerLauncher的handle收到LAUNCH_CONTAINER event后,通过containerLauncher.submit(launch)提交给ContainerLaunch,ContainerLaunch调用Call方法启动Container, ret = exec.launchContainer(exec为DefaultContainerExecutor类,在默认情况下),在DefaultContainerExecutor中launchContainer通过调用shExec.execute()(shExec在hadoop-common工程的Shell.java中),使runCommand执行脚本launch_container.sh,启动脚本之后,通过process.waitFor()等待脚本执行完成。


3). launch_container.sh会自动生成在/tmp/nm-local-dir/usercache/USERNAME/appcache下,生成脚本的内容一部分来自于RM之前通过RPC发来的命令(如上),编号为1的目录为启动MRAppMaster的脚本的所在目录;当Job完成后,USERNAME下的所有文件都会被自动删除。


2.  MRAppMaster.java 启动后会配置和启动一些Service来完成AM的功能,
当所有的Service都启动完成后,MRAppMaster.java进程结束。

Service Name: Dispatcher
Service Name: org.apache.hadoop.mapred.TaskAttemptListenerImpl
Service Name: TaskHeartbeatHandler
Service Name: TaskCleaner
Service Name: MRClientService
Service Name: org.apache.hadoop.mapreduce.v2.app.speculate.DefaultSpeculator
Service Name: org.apache.hadoop.mapreduce.v2.app.MRAppMaster$ContainerAllocatorRouter
Service Name: org.apache.hadoop.mapreduce.v2.app.MRAppMaster$ContainerLauncherRouter
Service Name: org.apache.hadoop.mapreduce.v2.app.MRAppMaster$StagingDirCleaningService
Service Name: JobHistoryEventHandler

1). MRAppMaster.java启动后会配置启动10个Services(如上), 同时,发送JOB_INIT和JOB_START事件给JobImpl.java,JobImpl的handle收到event后,stateMachine会从状态NEW -> INIT -> RUNNING,同时,在收到JOB_START时,JobImpl调用startTransition,并通过job.scheduleTasks向TaskImpl发送T_SCHEDULE,将状态从NEW->SCHEDULED,同时向TaskAttemptImpl发送TA_SCHEDULE,并TaskImpl开始监控TaskImpl,如果出错发送TA_RESCHEDULE,TaskAttemptImpl的状态从NEW->UNASSIGNED。

2). Hadoop Yarn调度中有很多Attempt的执行方式,意思是尝试执行,比如TaskImpl和TaskAttemptImpl,Task启动TaskAttempt后,监视TA,如果TA执行过慢,Task会从新启动一个TA,和之前的TA竞争执行,取其较快的结果;防止Hadoop被过慢的Node托慢整个Job。


  

你可能感兴趣的:(分布式)