zoukankan      html  css  js  c++  java
  • Spark代码中设置appName在client模式和cluster模式中不一样问题

    问题

    Spark应用名在使用yarn-cluster模式提交时不生效,在使用yarn-client模式提交时生效,如图1所示,第一个应用是使用yarn-client模式提交的,正确显示我们代码里设置的应用名Spark Pi,第二个应用是使用yarn-cluster模式提交的,设置的应用名没有生效。

    图1 提交应用

    回答

    导致这个问题的主要原因是,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模式都会读取,但是代码里优先级最高。

    在给apname赋值的时候,会先取命令行传入的参数再取客户端配置文件的参数。
    所以cluster模式读的是命令行配置。
     
     
  • 相关阅读:
    manjaro更换源
    质子重离子快速蒙卡MCsquare在ubuntu-20.04下的安装
    虚拟机硬盘容量不够如何解决
    《收获,不止oracle》读书笔记-未完
    Jenkins 性能:如何避免陷阱、诊断问题和扩展
    这是一个人工智能,你有什么紧急情况?
    人工智能:备忘单
    AI 变得越来越聪明、越来越快。这创造了我们无法回答的棘手问题
    什么是人工智能?你需要知道的关于人工智能的一切
    jenkins构建成功为何显示蓝色
  • 原文地址:https://www.cnblogs.com/itboys/p/10579352.html
Copyright © 2011-2022 走看看