Spark代码中设置appName在client模式和cluster模式中不一样问题
问题
Spark应用名在使用yarn-cluster模式提交时不生效,在使用yarn-client模式提交时生效,如图1所示,第一个应用是使用yarn-client模式提交的,正确显示我们代码里设置的应用名Spark Pi,第二个应用是使用yarn-cluster模式提交的,设置的应用名没有生效。
![](https://img2018.cnblogs.com/blog/906988/201903/906988-20190322163252138-1293167369.png)
回答
导致这个问题的主要原因是,yarn-client和yarn-cluster模式在提交任务时setAppName的执行顺序不同导致,yarn-client中setAppName是在向yarn注册Application之前读取,yarn-cluser模式则是在向yarn注册Application之后读取,这就导致yarn-cluster模式设置的应用名不生效。
解决措施:
在spark-submit脚本提交任务时用--name设置应用名和sparkconf.setAppName(appname)里面的应用名一样。
比如我们代码里设置的应用名为Spark Pi,用yarn-cluster模式提交应用时可以这样设置,在--name后面添加应用名,执行的命令如下:
./spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --name SparkPi lib/spark-examples*.jar 10
0x00 背景
首先,可以传入spark运行环境参数有三个地方:命令行(spark-subimit),代码(new SparkConf或SparkSession),client配置文件。
在spark提交任务时,代码里设置了appname,命令行和client配置文件都没有设置。
使用yarn-client模式提交,appname是代码里设置的。
使用yarn-cluster模式提交,appname变为执行类的全类名,例如com.aa.bb.Main。
0x01 原因
在源码里找到,如果appname设置为空,appname设置为类名。
SparkSubmitArguments源码:
可是明明在代码里设置了,为什么client模式可以,cluster模式不可以。
原因是client和cluster模式启动方式不一样(前面已经做过分析),cluster模式不会读取代码里配置,直接读取命令行配置。client模式都会读取,但是代码里优先级最高。
![](https://upload-images.jianshu.io/upload_images/1292779-5c00b0995b89f06f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000)
命令行传入的参数
再取客户端配置文件
的参数。所以cluster模式读的是命令行配置。
相关文章
- 阵列卡的IT和IR模式,lsi2308直通卡
- 最全面的AndroidStudio配置指南总结-包括护眼模式
- 实践GoF的23种设计模式:装饰者模式
- 简单工厂模式(创建型)
- 具体的client-server通信模型以及最为常用的通信模式
- Android夜间模式的几种实现
- Java中的常量:如何避免反模式
- AlwaysON同步的原理及可用模式
- 5G大机会与大风险下:运营商的五种5G部署模式
- 单例模式(三)
- cocos2d-x 混合模式
- Spark Client和Cluster两种运行模式的工作流程
- 从源码角度看Spark on yarn client & cluster模式的本质区别
- 【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 大数据Spark(九):Spark On Yarn两种模式总结
- 大数据Spark(八):环境搭建集群模式 Standalone HA