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

在纱线上使用带有Spark的typesafe配置

鲁博赡
2023-03-14

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

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

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

com.mycompany {
  //configurations my program needs
}

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

我用的是Spark1.6.1和纱线

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)

提前致谢

共有1个答案

邵沛
2023-03-14

因此,通过对Spark1.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 submit添加另一行,如下所示:--conf spark.driver.extrajavaoptions=“-dlog4j.configuration=file:log4j.xml”-注意,当您使用--files传递它时,您只需引用文件名,而不需要任何路径

注意:我还没有尝试过它,但从我所看到的情况来看,如果您试图在客户端模式下运行它,我认为spark.driver.extrajavaoptions行应该重命名为类似于driver-java-options这样的东西。这么简单,我希望这些事情能更好地记录下来。我希望这个答案能帮助某人

干杯

 类似资料:
  • 在配置spark应用程序时,我试图从集群中挤出每一点,但似乎我并没有完全正确地理解每一件事。因此,我正在AWS EMR集群上运行该应用程序,该集群具有1个主节点和2个m3类型的核心节点。xlarge(每个节点15G ram和4个vCPU)。这意味着,默认情况下,每个节点上为纱线调度的应用程序保留11.25 GB。因此,主节点仅由资源管理器(纱线)使用,这意味着剩余的2个核心节点将用于调度应用程序(

  • 在默认情况下加载的文件夹中有一个类型安全配置。 可以通过指定以下内容重写单个值: 将无法加载。相反,将加载resources文件夹中的原始文件。尝试以下技巧:在纱线上使用typesafe config和Spark也没有帮助。 当使用uberjar部署时,重写类型安全配置中的多个配置值似乎是普通(没有spark)程序的解决方案。问题仍然是如何使这一点产生火花。 同样通过的是: https://git

  • 我正在使用spark submit执行以下命令: spark submit script\u测试。py—主纱线—部署模式群集spark submit script\u测试。py—主纱线簇—部署模式簇 这工作做得很好。我可以在Spark History Server UI下看到它。但是,我无法在RessourceManager UI(纱线)下看到它。 我感觉我的作业没有发送到集群,但它只在一个节点上

  • 我正在使用EMR 4.1.0+spark 1.5.0+YARN来处理大数据。我正试图利用全集群,但有些如何纱没有分配所有的资源。 使用4个C3.8X大型EC2从机节点(每个60.0GB内存和32个核) 根据本文,我在EMR集群中设置了以下参数 yarn.nodemanager.resource.memory-MB->53856 yarn.nodemanager.resource.cpu-vcore

  • 我正在运行一个Ruby on Rails应用程序,Webpacker使用Yarn,并试图通过Docker Compose在Docker上运行这个程序。当我运行docker compose build时,它看起来运行成功,但找不到node\u modules文件夹,我无法使用任何节点包。我试着像其他帖子中建议的那样,将

  • 当我没有配置java home时,我提交了如下作业错误