Hadoop中job提交详细过程

本文详细介绍了Hadoop MapReduce任务从客户端提交到集群运行的整个流程,包括客户端提交、资源管理器调度、应用程序主启动及任务执行等关键步骤。

1)客户端运行hadoop jar命令的时候,通过程序中的waitForCompletion(true),进行job的提交,jobPI等等,其中主要的一个工作就是和集群建立连接,会创建一个yarnRunner(实际上是创建resMgrDelegate)代理对象,这个对提交的时候会调用job.submit(),方法进行提交,此方法中会进行一系列的工作,比如确定job的状态,设置新的A象实际上是一个通信协议的对象。由这个对象去和RM通信。

2)客户端向RM(先请求RMRM再转向applicationsManager/ASM)申请运行一个mr程序,获取一个applicationId

3RM会返回给客户端一个applicationId和一个共享资源的路径,用于提交程序运行所需要的共享资源

4)客户端拿到共享资源的路径,就开始进行将相关资源写入到共享资源路径中,相关资源就包括程序运行所需要的jar包及其他文件(job.jar)、配置文件参数job.xml(统一写入这个配置文件中)、切片信息(job.split

5)写完之后客户端通过resMgrDelegate.submitApplication(appContext)方法向RM报告文件写入完毕,带着一个appContext的上下文并提交应用程序。

6Rm接收到请求后,将这个请求转给yarn的资源调度器schedule,调度器会初始化这个应用,并将此应用程序加入到调度队列中(默认为容量调度),因为可能同时有很多应用在执行,可能没有资源供当前的程序跑,等待分配资源

resourceManager包括两个组件:

1、调度器:负责调度任务执行的顺序,仅是调度的作用,不参与任何任务的执行

1FIFO先进先出调度器:先来的任务先执行,只有一个队列

2Capacity容量(计算能力)调度器:有多个队列,为每个队列分配不同的资源,每个队列遵循FIFOhadoop 2中默认的调度模型)

3Fair公平调度器:所有任务平分共享资源

2、任务管理器applicationsManagerASM):负责任务启动或停止或失败启动 

7)等到分配到相关资源之后就调度器会先给应用程序在一个nodemanager中分配一个容器(container),然后在容器中先启动程序的管理者,用于管理任务的运行进度和完成情况,这个管理者叫APP MASTER(主类是MRAppMaster)。

8MRappmaster会对作业进行初始化,初始化的过程中会创建多个簿记对象(作业簿),用来跟踪作业的完成。

9)接下来MRAppMaster会启动相应的maptask,但是不知道启动几个啊,也不知道每一个对应的数据切片信息,怎么办?这时候就会去先访问共享文件系统中,获取本作业的输入切片信息。会获取到本job中有几个maptaskreducetask。此时mrappmaster会首先进行一个决策,就是如果maptask的数量小于10个,而reducetask的数量只有1个,并且输入大小小于一个块的作业,就会选用和MRAppmaster同一个JVM中运行任务,因为此时在别的节点上重新启动容器和销毁容器的开销过大不划算,这种模式就是uber模式。然后MRAppMaster会对每一个分片创建一个maptask对象。

10)如果作业不适合作为uber模式运行,此时MRAppMater就会为maptaskreducetask任务向RM申请资源,先发送maptask的请求,再发送reducetask的请求。注意maptask有数据本地化的局限。优先数据本地化,其次机架本地化最后任意节点。请求返回相应的节点信息。

11RMMRappMaster返回资源信息,空闲的资源节点,MRAppmaster就会去相应的nodemanager节点上启动Container

12)之后会启动一个YarnChild进程用于执行maptask程序

13Maptask执行之前会首先去共享文件系统中下拷贝相应的文件,包括jar包、job.xml文件以及job.split分片信息等,下载到本地

14)启动相应的maptask任务

15maptask进行到80%的时候,MRAppmaster会去启动reduceTask,启动过程同上述过程

16)资源回收和销毁


 

 

 

 

### 调试 Hadoop 任务提交源代码的关键点 调试 Hadoop 的任务提交过程涉及多个组件之间的交互,包括客户端、ResourceManager 和 NodeManager。以下是关于如何调试 Hadoop 任务提交源代码的一些重要指导: #### 1. **理解任务提交的核心流程** Hadoop 的任务提交主要由 `Client` 类完成,该类负责处理整个作业生命周期的初始化阶段。具体来说,它会执行以下操作[^1]: - 验证 Job 输入和输出的有效性。 - 计算 InputSplit 并将其分配给各个 MapTask。 - 如果需要,则配置分布式缓存的相关需求信息。 - 将 Job 所需的 JAR 文件及其 Configuration 复制到 HDFS 上的一个特定目录中。 - 向 ResourceManager 提交 Job 请求并持续监控其运行状态。 这些功能可以通过阅读 `org.apache.hadoop.mapreduce.JobSubmitter` 及其他相关类来深入了解。 #### 2. **设置断点的位置** 为了有效跟踪任务提交过程,在以下几个关键位置可以考虑放置断点: - 在 `JobSubmitter.submitJobInternal(Job, Cluster)` 方法内部观察实际提交逻辑是如何实现的。 - 查看 `DistributedCache.add*()` 系列方法调用来了解分布式缓存机制的工作原理。 - 对于 YARN 应用程序环境变量加载部分,可关注 `YarnConfiguration.addToClasspathIfNotPresent(String path)` 函数的行为[^2]。 #### 3. **修改配置文件支持更详细的日志记录** 为了让开发者更容易定位问题所在,建议调整如下几个属性以便获得更加详尽的日志输出[^3]: ```xml <property> <name>log4j.logger.org.apache.hadoop.mapred</name> <value>DEBUG</value> </property> <property> <name>mapreduce.job.debug-enabled</name> <value>true</value> </property> ``` 通过启用 DEBUG 级别的日志级别以及开启 job debug 功能,能够捕获更多有关 task execution lifecycle 的细节数据供分析使用。 #### 4. **利用 IDE 工具辅助开发与测试** 推荐采用 Eclipse 或 IntelliJ IDEA 这样的集成开发工具来进行本地编译构建项目的同时也方便单步执行查看每一步的变化情况。另外还可以借助 Maven 插件简化依赖管理等工作量较大的环节。 --- ### 示例代码片段展示如何打印当前classpath用于排查classloader问题 当遇到 ClassLoader 加载不到某些资源时,可通过下面这段简单的脚本帮助诊断原因: ```java public static void main(String[] args){ String classPath = System.getProperty("java.class.path"); System.out.println(classPath); } ``` 此段小程序可以帮助确认最终打包后的 jar 是否包含了预期中的库文件列表。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值