【问题标题】:Using typesafe config with Spark on Yarn在 Yarn 上使用带有 Spark 的类型安全配置
【发布时间】:2017-03-23 06:58:51
【问题描述】:

我有一个从配置文件读取数据的 Spark 作业。该文件是一个类型安全的配置文件。

读取配置的代码如下所示:

ConfigFactory.load().getConfig("com.mycompany")

现在我不将 application.conf 组装为我的 uber jar 的一部分,因为我想将文件作为外部文件传递

我要使用的外部application.conf的内容是这样的:

com.mycompany {
  //configurations my program needs
}

此 application.conf 文件存在于我的本地计算机文件系统上(而不是 HDFS 上)

我正在使用带有 Yarn 的 Spark 1.6.1

这就是我的 spark-submit 命令的样子:

LOG4J_FULL_PATH=/log4j-path
ROOT_DIR=/application.conf-path

    /opt/deploy/spark/bin/spark-submit \
    --class com.mycompany.Main \
    --master yarn \
    --deploy-mode cluster \
    --files $ROOT_DIR/application.conf \
    --files $LOG4J_FULL_PATH/log4j.xml \
    --conf spark.executor.extraClassPath="-Dconfig.file=file:application.conf" \
    --driver-class-path $ROOT_DIR/application.conf \
    --verbose \
    /opt/deploy/lal-ml.jar

我收到的异常是:

2016-11-09 12:32:14 ERROR ApplicationMaster:95 - User class threw exception: com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'com'
com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'com'
    at com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:124)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:147)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:159)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:164)
    at com.typesafe.config.impl.SimpleConfig.getObject(SimpleConfig.java:218)
    at com.typesafe.config.impl.SimpleConfig.getConfig(SimpleConfig.java:224)
    at com.typesafe.config.impl.SimpleConfig.getConfig(SimpleConfig.java:33)
    at com.mycompany.Main$.main(Main.scala:36)
    at com.mycompany.Main.main(Main.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:542)

所以我的问题是:有人知道如何使用 spark-submit 和 yarn 加载位于本地计算机上的外部类型安全 application.conf 文件吗?

我尝试遵循 How to add a typesafe config file which is located on HDFS to spark-submit (cluster-mode)? 和 Typesafe Config in Spark 以及 How to pass -D parameter or environment variable to Spark job? 中的一些解决方案,但没有任何效果

我会很感激任何解决这个问题的方向

提前致谢

【问题讨论】:

    标签: scala apache-spark hadoop-yarn typesafe-config


    【解决方案1】:

    因此,通过深入研究 Spark 1.6.1 源代码,我找到了解决方案。

    这些是您需要采取的步骤,以便在使用集群模式提交到 yarn 时获取应用程序使用的 log4j 和 application.conf:

    • 当传递几个文件时,就像我传递 application.conf 和 log4j.xml 文件一样,您只需使用如下一行来提交它们:--files "$ROOT_DIR/application.conf,$LOG4J_FULL_PATH/log4j.xml"(用逗号分隔)
    • application.conf 就是这样。 application.conf 不需要额外的JavaOpts(如我的问题中所写)。问题是 Spark 只使用了最后一个传递的 --files 参数,这就是传递 log4j 的原因。为了使用 log4j.xml,我还必须采取以下步骤
    • 在 spark 提交中添加另一行,如下所示:--conf spark.driver.extraJavaOptions="-Dlog4j.configuration=file:log4j.xml" - 请注意,使用 --files 传递它后,您可以只引用文件名而无需任何路径

    注意:我还没有尝试过,但是从我所看到的,如果您尝试在客户端模式下运行它,我认为 spark.driver.extraJavaOptions 行应该重命名为 driver-java-options 而已。如此简单,我希望这些事情得到更好的记录。我希望这个答案会对某人有所帮助

    干杯

    【讨论】:

    • 您应该能够为--files 使用逗号分隔的文件列表,而不是多次指定标志。
    • 是的,这正是我最终做的事情
    • --driver-java-options='-Dmy.config.path=myConfigValue' 来自another answer
    【解决方案2】:

    尽管这是一年前的一个问题,但我对 ConfigFactor 有一个类似的问题。 为了能够读取application.conf 文件,您必须做两件事。

    • 将文件提交给驱动程序。这是通过以下代码--files /path/to/file/application.conf 完成的。请注意,如果您愿意,可以从 HDFS 读取它。
    • 提交 com.typesafe.config 包。这是通过--packages com.typesafe:config:version 完成的。

    由于application.conf 文件与主 jar 应用程序位于同一临时目录中,因此您可以在代码中假设。

    使用上面给出的答案(https://stackoverflow.com/a/40586476/6615465),这个问题的代码如下:

    LOG4J_FULL_PATH=/log4j-path
    ROOT_DIR=/application.conf-path
    
    /opt/deploy/spark/bin/spark-submit \
    --packages com.typesafe:config:1.3.2
    --class com.mycompany.Main \
    --master yarn \
    --deploy-mode cluster \
    --files "$ROOT_DIR/application.conf, $LOG4J_FULL_PATH/log4j.xml" \
    --conf spark.executor.extraClassPath="-Dconfig.file=file:application.conf" \
    --driver-class-path $ROOT_DIR/application.conf \
    --verbose \
    /opt/deploy/lal-ml.jar
    

    【讨论】:

    • 请注意,上面的代码 sn-p 有一个错字 - 第一行缺少 LOG4J_FULL_PATH 中的“L”。我无法编辑答案,因为它只是一个字符编辑 - 必须至少为 6 才能被接受为编辑!
    猜你喜欢
    • 1970-01-01
    • 2020-04-24
    • 2014-11-16
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多