如何添加位于HDFS上的类型安全配置文件以进行spark-submit(集群模式)?

时间:2016-02-19 15:59:37

标签: hadoop apache-spark hdfs typesafe

我有一个Spark(Spark 1.5.2)应用程序,可以将数据从Kafka传输到HDFS。我的应用程序包含两个Typesafe配置文件,用于配置某些内容,如Kafka主题等。

现在我想在群集中使用spark-submit(群集模式)运行我的应用程序。 包含项目所有依赖项的jar文件存储在HDFS上。 只要我的配置文件包含在jar文件中,一切正常。但这对于测试来说是不切实际的,因为我总是需要重建jar。

因此我排除了项目的配置文件,并通过" driver-class-path"添加了它们。这适用于客户端模式,但如果我现在将配置文件移动到HDFS并以群集模式运行我的应用程序,它将无法找到设置。您可以在下面找到我的spark-submit命令:

/usr/local/spark/bin/spark-submit \
    --total-executor-cores 10 \
    --executor-memory 15g \
    --verbose \
    --deploy-mode cluster\
    --class com.hdp.speedlayer.SpeedLayerApp \
    --driver-class-path hdfs://iot-master:8020/user/spark/config \
    --master spark://spark-master:6066 \
    hdfs://iot-master:8020/user/spark/speed-layer-CONFIG.jar

我已经尝试使用--file参数,但这也没有用。有谁知道我怎么解决这个问题?

更新:

我做了一些进一步的研究,我发现它可能与HDFS路径有关。我将HDFS路径更改为" hdfs:/// iot-master:8020 //用户// spark // config但不幸的是,这也没有用。但也许这可以帮到你。

下面你还可以看到我在集群模式下运行驱动程序时遇到的错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    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:497)
    at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:58)
    at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala)
Caused by: java.lang.ExceptionInInitializerError
    at com.speedlayer.SpeedLayerApp.main(SpeedLayerApp.scala)
    ... 6 more
Caused by: com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'application'
    at com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:124)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:145)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:159)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:164)
...

2 个答案:

答案 0 :(得分:4)

试图获得相同的结果我发现了以下内容:

  1. - files:仅与运行spark-submit命令的计算机上的本地文件相关联,并转换为define("lconn/core/filepublish", [ 'dojo/ready','dojox/xml/parser', 'dijit/form/Form', 'dojo/io/script', 'dojo/data/ItemFileReadStore', ], function(ready,parser, Form, script, ItemFileReadStore) { dojo.declare("lconn.core.filepublish", null,{ UrlPrefix:null, timeoutDuration: null, onLoad: function() { console.log("UrlPrefix="+UrlPrefix); var valArgs = { url :kosmosUrlPrefix+ "/XXX/XXX/XXXX/admin/ValidateCommunity?communityUuId="+communityUuid, callbackParamName:"validatecallback", timeout:timeoutDuration, load: function(response, ioArgs){ console.log('in load function to validate if its comunity....'); } } } }); }); 。所以除非你能够在检索文件之前运行conf.addFile(),否则hdfs文件将无法工作。在我的情况下,我想从oozie运行它,所以我不知道它将在哪台机器上运行,我不想在我的工作流程中添加复制文件操作。
  2. @Yuval_Itzchakov引用的引用引用--jars只处理jar,因为它转换为hdfs dfs -get <....>
  3. 据我所知,没有严格的方法可以从hdfs加载配置文件。

    我的方法是将路径传递给我的应用并读取配置文件并将其合并到参考文件中:

    conf.addJar()

    P.S错误只表示ConfigFactory没有找到任何配置文件,因此他无法找到您要查找的属性。

答案 1 :(得分:1)

一个选项是使用--files标志和HDFS位置,并确保使用带有spark.executor.extraClassPath的{​​{1}}标记将其添加到执行程序类路径中:

  

Spark使用以下URL方案来允许不同的   传播罐子的策略:

     
      
  • file: - 绝对路径和文件:/ URI由驱动程序的HTTP提供   文件服务器,每个执行程序从驱动程序HTTP中提取文件   服务器。
  •   
  • hdfs:,http:,https:,ftp: - 这些下拉文件和JAR   来自URI的预期
  •   
  • local: - 以local:/开头的URI   期望在每个工作节点上作为本地文件存在。这意味着   不会产生网络IO,适用于大型文件/ JAR   被推送给每个工作者,或通过NFS,GlusterFS等共享
  •   

此外,您在查看-Dconfig.file的帮助文档时可以看到它:

spark-submit

使用spark-submit运行:

--files FILES           Comma-separated list of files to be placed in the working
                        directory of each executor.