【问题标题】:How to externalize and load property file from external path in a spark job when submitting the job提交作业时如何在火花作业中从外部路径外部化和加载属性文件
【发布时间】:2019-12-08 12:31:45
【问题描述】:

我正在使用 java8 和 spark 2.4.1 编写我的 spark-job,其中我使用 TypeSafe 加载属性文件,即位于“resources”文件夹中的 application.properties,其内容如下所示

dev.deploymentMaster=local[8]
dev.spark.eventLog.enabled=true
dev.spark.dynamicAllocation.enabled=false
dev.spark.executor.memory=8g

在程序中,我在提交 spark 作业(即 spark-submit)时将“环境”变量作为“dev”进行加载,如下所示

 public static Config loadEnvProperties(String environment) {
      Config appConf = ConfigFactory.load();
      return  appConf.getConfig(environment);
  }

上面的工作正常......但是这个“application.properties”文件在“resources”文件夹中。

从 spark-submit 作业提交时如何传递“application.properties”文件路径?我需要使用 TypeSafe 对我的代码进行哪些更改?如果可能的话,你能提供一些java示例吗?

在 sprint 启动中,我们有一些称为 profiling 的东西,例如 application-dev.properties 、 application-qa.properties 和 application-prod.properties 等......加载这些特定的环境属性在提交工作?如果可以,请提供一些细节或sn-p如何实现它?

【问题讨论】:

    标签: apache-spark apache-spark-sql databricks typesafe typesafe-config


    【解决方案1】:

    但是这个“application.properties”文件在“resources”里面 文件夹。

    如何在提交时传递“application.properties”文件路径 来自 spark-submit 工作?

    1) 将 maven 程序集或 shade 插件/sbt 分发结构准备为 bin for shell scripts lib for libraries 或 uber jar conf 用于所有配置文件,如 application.properties 或 application.conf

    示例分布结构:

    .
    └── yourproject
        ├── bin // all shell scripts and spark-submits
        ├── conf // your property file environment wise
        │   ├── application.conf
        │   └── log4j.properties
        └── lib   // your jars or uber jar
    

    2) 准备一个 shell 脚本,该脚本将接受 envt 参数使用,如下所示

    部署模式集群:

    spark-submit --master yarn --deploy-mode cluster  --num-executors 4 --driver-memory 6g --executor-memory 20g --executor-cores 4 --files conf/application_$env.conf --class yourclass lib/yourjar.jar
    

    部署模式客户端:

    spark-submit --master yarn --deploy-mode client --num-executors 4 --driver-memory 6g --executor-memory 20g --executor-cores 4 --files conf/application$env.conf --spark.driver.extraJavaOptions -Dconfig.file=conf/application$env.conf  --spark.executor.extraJavaOptions -Dconfig.file=conf/application$env.conf --class yourclass  lib/yourjar.jar
    

    您的 configfactor.load 将从 -Dconfig.file=conf/application$env.conf 加载 但在部署模式集群中,它可能无法从此系统属性加载,因为您的驱动程序不是本地计算机。它是集群中的节点之一。

    -- files 会将您的文件传递到您的 hdfs 下的临时目录。 --files 可以直接引用文件名,不带任何路径 您可能需要在集群模式下使用ConfigFactory.parseFile(configFile) 而不是ConfigFactory.load()。因为我观察到load 正在加载\etc\spark\conf\spark-default.conf,正如我在我的案例中观察到的那样。

    【讨论】:

    • 只需尝试下一步,您就会自动理解。在集群模式下Config appConf = ConfigFactory.load(); 可能无法正常工作。您需要传递实际的 application.conf 文件 ...ConfigFactory.parseFile(configFile) 因为驱动程序将是集群中的节点之一,而不是您的本地机器
    • 如果你没事请关注accept answer as owner
    • 谢谢你,Ram 这里的属性文件还在jar 中,即conf/application$env.conf??我可以将它指向 ./somefolder/application$env.conf 吗??
    • 是的,这就是我所说的,不要将属性文件放在 jar 中,请参阅 maven 程序集插件以集成您的发行版
    • Ram 我按照你的建议试过了,但它不起作用..我想我错过了一些东西......请在这里检查一次stackoverflow.com/questions/57330285/…
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多