拿submit 提交的yarn id的更好方式

本文介绍了一种在Java中实时捕获Shell脚本输出的方法,通过将Shell命令的输出流重定向到Java的输入流,可以立即获取到如appid等关键信息,而无需等待整个Shell进程结束。

之前利用shell取的方式不太好,应为会等整个过程结束才能拿到appid
因为我是在java调用启动脚本的
那么直接在java那边获取实时输出进行判断就可以了

shell 代码后面加上  2>&1

java代码

 BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
            StringBuffer resultBuffer = new StringBuffer();
            String line;
            while ((line = br.readLine())!= null  )
            {
                //Submitted application application_1591596770810_0238
                    if(line.contains("Submitted application")) {
                        String appid=line.substring(line.indexOf("application"))); 
                    }
            }

这种,就可以在一提交就能拿到appid

<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
发出的红包

打赏作者

南修子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值