scala - 在 Spark on Yarn 中使用类型安全配置

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

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

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

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

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

我想要使用的外部 application.conf 的内容如下所示:

com.mycompany {
  //configurations my program needs
}

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

我正在使用 Spark 1.6.1 和 Yarn

这就是我的 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?但没有任何效果

如果有任何解决此问题的指导,我将不胜感激

提前致谢

最佳答案

通过深入研究 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 不需要 extraJavaOpts (如我的问题中所写)。问题是 Spark 仅使用传递的最后一个 --files 参数,这就是传递 log4j 的原因。为了使用 log4j.xml 我还必须采取以下步骤
  • 向 Spark 提交添加另一行,如下所示: --conf spark.driver.extraJavaOptions="-Dlog4j.configuration=file:log4j.xml" - 请注意,一旦使用 - 传递它-files 可以只引用文件名,不带任何路径

注意:我还没有尝试过,但从我所看到的情况来看,如果您尝试在客户端模式下运行它,我认为 spark.driver.extraJavaOptions 行应该重命名为 driver 之类的内容-java-选项 就是这样。如此简单,我希望这些事情能得到更好的记录。我希望这个答案能帮助别人

干杯

关于scala - 在 Spark on Yarn 中使用类型安全配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40507436/

相关文章:

scala - 要使此代码正常工作(一般情况下)需要导入什么?

java - 如何设置 Spark 执行器的数量?

scala - 为什么启动我的 Spark Streaming 应用程序会给出 "Container exited with a non-zero exit code 50"?

scala - 无法在 IntelliJ + sbt-idea-plugin 中调试 Scala 应用程序

scala - 如何在案例类的每个字段上应用函数

scala - Scala 中使用索引进行高效迭代

apache-spark - Hadoop:Spark作业无法处理小型数据集

scala - 可以在 spark 中处理多字符分隔符

scala - 如何获取Scala中部署到YARN的Spark应用程序的applicationId?

hadoop - 如何知道 Yarn fair share Scheduler 上是否发生抢占?