【问题标题】:Submit an application property file with Spark typesafe config使用 Spark 类型安全配置提交应用程序属性文件
【发布时间】:2018-11-13 22:53:26
【问题描述】:

拜托,我需要你的帮助,我正在尝试使用类型安全配置为我的 spark 应用程序提交一个外部配置文件。

我正在我的应用程序代码中加载 application.conf 文件,如下所示:

  lazy val conf = ConfigFactory.load()

文件内容

  ingestion{
  process {
    value = "sas"
  }
  sas {
    origin{
      value = "/route"
    }
    destination{
      value = "/route"
    }
    extension{
      value = ".sas7bdat"
    }
    file{
      value = "mytable"
    }
    month{
      value = "201010,201011"
    }
    table{
      value = "tbl"
    }
  }
}

我的 spark 提交是

spark2-submit --class com.antonio.Main --master yarn --deploy-mode client --driver-memory 10G --driver-cores 8 --executor-memory 13G --executor-cores 4 --num-executors 10 --verbose  --files properties.conf /home/user/ingestion-1.0-SNAPSHOT-jar-with-dependencies.jar --files application.conf

但由于某种原因,我收到了

com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'ingestion'

一切看起来都配置正确??我错过了什么吗?

谢谢,

安东尼奥

【问题讨论】:

    标签: scala apache-spark typesafe-config


    【解决方案1】:

    默认情况下,您的application.conf 必须存在于类路径的根目录中,ConfigFactory.load() 才能找到它。或者,您可以通过系统属性修改找到application.conf 文件的位置。因此,您的选择如下。

    第一种选择是将作业的根目录添加到类路径:

    spark2-submit ... \
        --conf spark.driver.extraClassPath=./  \
        --conf spark.executor.extraClassPath=./  \    // if you need to load config at executors
        ...
    

    保持--files 选项不变。请注意,如果您在客户端模式下运行作业,则必须将驱动计算机上application.conf 所在位置的正确路径传递给spark.driver.extraClassPath 选项。

    第二种选择是(我认为这个更好),您可以使用config.file 系统属性来影响ConfigFactory.load() 查找配置文件的位置:

    spark2-submit ... \
        --conf spark.driver.extraJavaOptions=-Dconfig.file=./application.conf \
        --conf spark.executor.extraJavaOptions=-Dconfig.file=./application.conf \
        ...
    

    关于在执行器上加载配置并保留--files 选项的备注也适用于此处。

    【讨论】:

    • 感谢您的快速回答@vladimir-matveev 我刚刚使用此代码spark2-submit --class com.demo.Main --master yarn --deploy-mode client --driver-memory 10G --driver-cores 8 --executor-memory 13G --executor-cores 4 --num-executors 10 --verbose --conf "spark.driver.extraJavaOptions=-Dconfig.file=/home/user/application.conf" --conf "spark.executor.extraJavaOptions=-Dconfig.file=/home/user/application.conf" --files "application.conf" /home/user/ingestion-1.0-SNAPSHOT-jar-with-dependencies.jar
    • @AntonioCachuan 请注意,在大多数环境中,为执行程序上的配置文件指定绝对路径并不是一个好主意,因为通常这些文件通过 YARN 分布式缓存发送到执行程序,它可以虚拟复制该文件任何地方,但通常它应该是执行程序 JVM 的“工作目录”,因此可以通过相对路径访问。因此,请考虑改用相对路径,因为它会使您的工作更有弹性,并且能够在环境之间正确转移。
    • 话虽如此,在许多情况下执行器根本不会显式加载配置(它们通常通过闭包捕获它,这些闭包被序列化并与配置对象一起发送给执行器),因此传递-Dconfig.file执行者的选项可能是不必要的。但是,如果您曾经在集群部署模式下运行您的工作,那么即使在驱动程序上也不能使用绝对路径,因为在集群模式下,驱动程序也在集群的某个位置启动并且应该使用分布式配置文件的版本。
    • @VladimirMatveev 非常感谢,我可以传递多个文件,例如 --conf spark.driver.extraJavaOptions=-Dconfig.file=./application.conf \ --conf spark.driver。 extraJavaOptions=-Dconfig.file=./application2.conf \ ??即 application.conf & application2.conf
    • @VladimirMatveev 当我一直这样 --files /local/apps/log4j.properties, /local/apps/applicationNew.properties \ --conf spark.driver.extraJavaOptions=-Dconfig.file= applicationNew.properties \ --conf spark.executor.extraJavaOptions=-Dconfig.file=applicationNew.properties \ 它在线程“main” org.apache.spark.SparkException 中抛出错误异常:无法从 JAR 文件加载主类:/local/ org.apache.spark.deploy.SparkSubmitArguments.error(SparkSubmitArguments.scala:657) 处的应用程序/应用程序New.properties
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2020-04-24
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多