基于YARN的两种提交模式

本文详细解析了YARN环境下Spark任务的两种提交模式:cluster与client模式的工作流程,包括从提交Application到完成任务的全过程。通过ResourceManager、ApplicationMaster、NodeManager等组件之间的交互,展示了资源申请、分配及任务执行的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

yarn-cluster提交模式:

1,spark-submit提交,发送请求到ResourceManager请求启动ApplicationMaster;

2,ResourceManager分配container在某个nodemanager上,启动ApplicationMaster(相当于Driver);

3,ApplicationMaster找到ResourceManager,进行反注册,请求container启动executor;

4,ResourceManager分配一批container用于启动executor;

5,ApplicationMaster连接其他NodeManager来启动executor,这里的NodeManager相当于Worker,executor启动后向ApplicationMaster反注册。

yarn-client提交模式:

1,spark-submit提交,在本地启动Driver进程,并发送请求给ResourceManager,请求ApplicationMaster。

2,ResourceManager接收到请求之后分配一个container在某个NodeManager(其实只是一个ExecutorLauncher,相当于ApplicationMaster)。

3,ExecutorLanucher向ResourceManager申请container,启动executor;

4,ResourceManager分配一批contianer然后ApplicationMaster直接连接启动NodeManager,用contianer的资源,启动executor;

5,executor启动后会反注册到本地的Driver上。

 

描述Yarn执行一个任务的过程?
1)客户端client向ResouceManager提交Application,ResouceManager接受Application
并根据集群资源状况选取一个node来启动Application的任务调度器driver(ApplicationMaster)
2)ResouceManager找到那个node,命令其该node上的nodeManager来启动一个新的
JVM进程运行程序的driver(ApplicationMaster)部分,driver(ApplicationMaster)启动时会首先向ResourceManager注册,说明由自己来负责当前程序的运行
3)driver(ApplicationMaster)开始下载相关jar包等各种资源,基于下载的jar等信息决定向ResourceManager申请具体的资源内容。
4)ResouceManager接受到driver(ApplicationMaster)提出的申请后,会最大化的满足
资源分配请求,并发送资源的元数据信息给driver(ApplicationMaster);
5)driver(ApplicationMaster)收到发过来的资源元数据信息后会根据元数据信息发指令给具体
机器上的NodeManager,让其启动具体的container。
6)NodeManager收到driver发来的指令,启动container,container启动后必须向driver(ApplicationMaster)注册。
7)driver(ApplicationMaster)收到container的注册,开始进行任务的调度和计算,直到
任务完成。
补充:如果ResourceManager第一次没有能够满足driver(ApplicationMaster)的资源请求
,后续发现有空闲的资源,会主动向driver(ApplicationMaster)发送可用资源的元数据信息
以提供更多的资源用于当前程序的运行。

<think>好的,用户现在想了解如何在Spark中将代码提交YARN的示例代码。我需要结合之前的对话和用户提供的引用来回答。首先,用户之前的问题是关于初始化空的DataFrame,现在转向了任务提交YARN,这可能涉及到Spark的不同部署模式。 用户提供的引用1提到了在yarn-cluster模式下使用org.apache.spark.deploy.yarn.Client作为包装类,这说明在代码中可能需要设置相关的主类。引用2则提到从Java代码提交Spark作业到YARN集群,虽然需要手动更改参数,但方法相对直接。用户现在需要具体的示例代码,可能需要Scala或Java的例子。 回顾用户的历史问题,他们之前处理的是Scala中的Dataset操作,所以可能更倾向于Scala的示例。此外,用户的需求是提交应用到YARN集群,需要区分client和cluster模式,并展示不同的方法。 接下来,我需要考虑用户可能的实际场景。他们可能是在开发一个需要部署到YARN集群的Spark应用,或者是在自动化任务提交流程,需要以编程方式提交作业,而不是通过spark-submit脚本。这时候,示例代码需要展示如何配置SparkConf,设置YARN相关的属性,如master、部署模式、应用名称、executor资源等。 同时,用户可能需要了解两种不同的提交方式:通过SparkSubmit主类和使用YARN Client API。前者类似于命令行调用,后者更程序化。需要说明两者的优缺点,比如SparkSubmit方式简单但不够灵活,而YARN Client API适合动态参数的情况。 另外,注意事项部分需要提到资源分配、日志查看、权限问题等,这些都是实际部署中可能遇到的坑。比如用户可能需要调整executor的内存和核心数,或者处理依赖包的分发问题。 最后,用户的相关问题可能涉及动态参数传递、日志调试或不同部署模式的区别,需要提前预测并生成这些问题,帮助他们进一步探索。 总结,回答的结构应包括两种方法的具体代码示例、模式选择的说明、注意事项和相关问题,确保覆盖用户的实际需求,并提供足够的参考信息。</think>以下是基于Spark 2.4+版本的YARN提交代码实现方案,包含两种典型场景和关键配置说明: --- ### **一、通过SparkSubmit工具类提交(推荐)** 这是最接近`spark-submit`命令行的实现方式,适用于需要完全控制参数传递的场景。 ```scala import org.apache.spark.deploy.SparkSubmit object YarnSubmitExample { def main(args: Array[String]): Unit = { val submitArgs = Array( "--class", "com.example.YourMainClass", "--master", "yarn", "--deploy-mode", "cluster", // 或 "client" "--name", "SparkYarnDemo", "--executor-memory", "4g", "--executor-cores", "2", "--num-executors", "5", "/path/to/your-app.jar", "arg1", "arg2" // 传递应用程序参数 ) SparkSubmit.main(submitArgs) } } ``` #### **关键参数解析** - `--master yarn`:强制指定YARN资源管理器 - `--deploy-mode cluster`:在YARN集群中运行Driver(适合生产环境)[^1] - `--queue default`:可添加队列名称指定资源池 - `--conf spark.yarn.maxAppAttempts=2`:通过`--conf`传递Spark配置参数 --- ### **二、通过YARN Client API提交(编程式)** 适用于需要动态构建配置的场景(如参数来自数据库),需添加依赖: ```xml <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-yarn_2.11</artifactId> <version>${spark.version}</version> </dependency> ``` ```scala import org.apache.spark.deploy.yarn.Client import org.apache.spark.{SparkConf, SparkContext} val conf = new SparkConf() .setAppName("DynamicYarnSubmit") .setMaster("yarn") .set("spark.submit.deployMode", "cluster") .setJars(Seq("/path/to/your-app.jar")) // 必须指定JAR路径 .set("spark.executor.instances", "3") .set("spark.yarn.queue", "production") new Client(new ClientArguments(Array()), conf).run() ``` --- ### **三、模式选择对比** | 特性 | YARN Cluster模式 | YARN Client模式 | |-----------------------|--------------------------------------|--------------------------------------| | **Driver位置** | 在YARN容器中运行 | 在提交客户端本地运行 | | **日志查看** | 需要通过`yarn logs`命令获取 | 直接输出到提交终端 | | **资源占用** | 需要分配Driver容器资源 | 客户端机器承担Driver负载 | | **适用场景** | 生产环境、长期任务 | 开发调试、交互式分析 | --- ### **四、常见问题解决方案** 1. **ClassNotFound异常** 确保通过`--jars`参数传递依赖包,或使用`spark.yarn.dist.jars`配置: ```scala .set("spark.yarn.dist.jars", "/lib/mysql-connector-java.jar,/lib/commons-lang3.jar") ``` 2. **资源分配失败** 检查YARN队列资源余量,调整参数组合: ```scala .set("spark.executor.memoryOverhead", "1024") // 堆外内存 .set("spark.yarn.executor.memoryOverheadFactor", "0.1") ``` 3. **Kerberos认证** 在代码中加载keytab文件(需提前配置): ```scala UserGroupInformation.loginUserFromKeytab("user@REALM", "/path/to/user.keytab") ``` --- ### **五、调试技巧** - **查看YARN日志** ```bash yarn logs -applicationId <app_id> > spark.log ``` - **启用DEBUG日志** 添加配置: ```scala .set("spark.logConf", "true") .set("spark.driver.extraJavaOptions", "-Dlog4j.configuration=file:log4j-debug.properties") ``` --- ### **六、生产环境最佳实践** 1. **资源计算公式** ```scala val totalCores = spark.conf.get("spark.executor.instances").toInt * spark.conf.get("spark.executor.cores").toInt require(totalCores <= yarnClusterMaxCores, "超额申请资源") ``` 2. **动态分区感知** 启用YARN节点标签功能: ```scala .set("spark.yarn.executor.nodeLabelExpression", "GPU") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值