当前位置: 首页 > 知识库问答 >
问题:

使用Typesafe配置时在Spark YARN客户端和集群模式之间切换

徐弘图
2023-03-14

一直在努力解决使用Spark YARN处理多个配置文件以及在集群和客户端模式之间切换的问题。

在我的应用程序中,我需要加载两个配置文件:

  1. 应用程序配置
  2. 环境配置

示例-application.conf:

include required(file("env.conf"))

app {
  source
    {
      source-name: "some-source"
      source-type: "file"
      source-path: ${env.some-source-path}
    }
   ....
}

env.conf:

env {
  some-source-path: "/path/to/file"
}

代码:

// Spark submit that works:
$SPARK_HOME/bin/spark-submit --class ${APP_MAIN_CLASS} \
    --master yarn \
    --deploy-mode cluster \
    --name ${APP_INSTANCE} \
    --files ${APP_BASE_DIR}/conf/${ENV_NAME}/env.conf,${APP_BASE_DIR}/conf/example-application.conf \
    --principal ${PRINCIPAL_NAME} --keytab ${KEYTAB_PATH} \
    --jars ${JARS} \
    --num-executors 10 \
    --executor-memory 4g \
    --executor-cores 4 \
    ${APP_JAR} "example-application.conf" "$@"

// How above file is loaded in code:
val appConfFile = new File(configFileName)   // configFileName = "example-application.conf"
val conf = ConfigFactory.parseFile(appConfFile)

有什么建议如何设置,以便我可以轻松地交换集群和客户端模式?

谢谢!

共有1个答案

傅增
2023-03-14

作为spark-submit的一部分传递配置文件的完整路径&处理spark代码中的解压缩逻辑。

spark.submit.deploymode=client然后取完整路径,即${APP_BASE_DIR}/conf/example-application.conf

spark.submit.deploymode=cluster然后只取文件名,即example-application.conf


// Spark submit that works:
$SPARK_HOME/bin/spark-submit --class ${APP_MAIN_CLASS} \
    --master yarn \
    --deploy-mode cluster \
    --name ${APP_INSTANCE} \
    --files ${APP_BASE_DIR}/conf/${ENV_NAME}/env.conf,${APP_BASE_DIR}/conf/example-application.conf \
    --principal ${PRINCIPAL_NAME} --keytab ${KEYTAB_PATH} \
    --jars ${JARS} \
    --num-executors 10 \
    --executor-memory 4g \
    --executor-cores 4 \
    ${APP_JAR} ${APP_BASE_DIR}/conf/example-application.conf "$@"

// How above file is loaded in code:

val configFile = if(!spark.conf.get("spark.submit.deployMode").contains("client")) configFileName.split("/").last else configFileName

val appConfFile = new File(configFile)   // configFileName = "example-application.conf"
val conf = ConfigFactory.parseFile(appConfFile)

 类似资料:
  • TL;DR:在Spark独立集群中,客户端和集群部署模式之间有什么区别?如何设置应用程序运行的模式? 我们有一个带有三台机器的Spark独立集群,它们都带有Spark 1.6.1: 主机,也是使用运行应用程序的地方 2台相同的工作机 2)如何使用选择应用程序将运行在哪个上?

  • 有两种部署模式可用于在YARN上启动Spark应用程序。在yarn-cluster模式下,Spark驱动程序在集群上由YARN管理的应用程序主进程中运行,客户端可以在启动应用程序后离开。在yarn-client模式下,驱动程序在客户端进程中运行,而应用程序主进程仅用于向YARN请求资源。 在此,我只能理解的区别是哪个地方的驱动程序在运行,但我无法理解哪个运行得更快。莫尔沃弗: 在运行Spark-s

  • 我有Kubernetes在两种不同的环境中工作良好,即在我的本地环境(运行minikube的MacBook)和谷歌的容器引擎(GCE,谷歌云上的Kubernetes)。我使用MacBook/local环境开发和测试我的YAML文件,完成后,在GCE上试用。 目前,我需要单独处理每个环境:我需要在本地环境中编辑YAML文件,准备好后,(git)将它们克隆到GCE环境中,然后使用/部署它们。这是一个有

  • 要设置,我尝试了以下方法。 方法1:使用broadcast变量将tns.ora文件复制到所有执行程序sparksession.sparkcontext()。broadcast(“/tmp/conf/”,classTagTest) 方法2:在spark submit命令中使用--files参数传递tns.ora文件,并设置--conf spark.executor.extrajavaoptions=

  • 我有一个项目连接到独立的redis,客户端创建为: 用于绝地武士和spring data redis的库版本为: 现在我需要移动到集群redis,并将客户端创建更改为 通过此代码更改,我在群集中找不到可访问的节点,如下所示: } 由于spark-2.1.3中运行了spark应用程序,由于版本依赖性,我需要使用相同的spring data redis。如果没有jedis和spring data re

  • 我正在使用https://apacheignite-mix.readme.io/v1.7/docs/automatic-persistence将数据从数据库加载到Ignite缓存中。 我使用Ignite客户端模式运行代码,并希望将数据加载到Ignite集群中。 null