二、基于yarn的两种提交模式

本文详细对比了YARN-Cluster与YARN-Client两种模式的运行流程,阐述了它们在资源管理和任务执行上的差异。YARN-Cluster模式适合生产环境,能有效避免网络流量激增,但调试较难;而YARN-Client模式适用于测试环境,虽然会导致大量网络通信,但便于本地调试。

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

一 yarn-cluster模式

1. 发送请求到ResourceManager,请求启动ApplicationMaster。

2. 在某个NodeManager上启动ApplicationMaster。

3. ApplicationMaster向ResourceManager申请container,启动executor。

4. 分配一批container,用于启动executor。

5. AM连接其它NM,启动executor。

6. executor启动后,向AM反向注册。

 

二 yarn-client模式

1. 发送请求到ResourceManager,请求启动ApplicationMaster。

2. 在某个NodeManager上分配一个container,启动ApplicationMaster。这里的AM其实只是一个ExecutorLanucher。

3. ApplicationMaster向ResourceManager申请container,启动executor。

4. 分配一批container,用于启动executor。

5. AM连接其它NM,启动executor。

6. executor启动后,反向注册到本地的Driver上。

注:红色字体为区分点。

 

yarn-cluster与yarn-client用途建议:

A.  yarn-claster用于生产环境。Driver运行在nodemanager,不需要通过网络传输到提交机器,没有网卡流量激增的问题。

缺点在于,调试不方便。本地spark-submit后,看不到log,只能通过yarn application logs application_id这种命令来查看,很麻烦。

B.  yarn-client用于测试环境。Driver运行在本地客户端,负责调度application,会与yarn集群产生超大量网络通信,从而导致网卡流量激增。

好处在于,可以在本地看到所有log,方便调试。

 

<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集群,需要区分clientcluster模式,并展示不同的方法。 接下来,我需要考虑用户可能的实际场景。他们可能是在开发一个需要部署到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、付费专栏及课程。

余额充值