如何添加一个位于hdfs上的typesafe配置文件来spark submit(集群模式)?

bq3bfh9z  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(395)

我有一个spark(spark1.5.2)应用程序,它将数据从kafka流到hdfs。我的应用程序包含两个typesafe配置文件来配置某些东西,比如kafka主题等。
现在我想在集群中使用spark submit(集群模式)运行我的应用程序。包含项目所有依赖项的jar文件存储在hdfs上。只要我的配置文件包含在jar文件中,一切都正常。但是这对于测试来说是不现实的,因为我总是要重建jar。
因此,我排除了我的项目的配置文件,并通过“驱动程序类路径”添加它们。这在客户机模式下工作,但是如果我现在将配置文件移动到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//user//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)
...
1u4esq0p

1u4esq0p1#

为了达到同样的效果,我发现了以下几点:
--文件:仅与运行spark submit命令的计算机上的本地文件关联,并转换为 conf.addFile() . 因此,除非您能够运行 hdfs dfs -get <....> 在检索文件之前。在我的情况下,我想从oozie运行它,所以我不知道它将在哪台机器上运行,我不想添加一个复制文件的行动,我的工作流程。
引用@yuval_itzchakov take是指--jars,它只处理jar,因为它转换为 conf.addJar() 因此,据我所知,从hdfs加载配置文件是不可能的。
我的方法是将路径传递给我的应用程序,读取配置文件并将其合并到引用文件中:

private val HDFS_IMPL_KEY = "fs.hdfs.impl"
def loadConf(pathToConf: String): Config = {
   val path = new Path(pathToConf)
   val confFile = File.createTempFile(path.getName, "tmp")
   confFile.deleteOnExit()
   getFileSystemByUri(path.toUri).copyToLocalFile(path, new Path(confFile.getAbsolutePath))

   ConfigFactory.load(ConfigFactory.parseFile(confFile))
}

def getFileSystemByUri(uri: URI) : FileSystem  = {
   val hdfsConf = new Configuration()
   hdfsConf.set(HDFS_IMPL_KEY, classOf[org.apache.hadoop.hdfs.DistributedFileSystem].getName)
FileSystem.get(uri, hdfsConf)
}

p、 这个错误只意味着configfactory没有找到任何配置文件,所以他找不到您要查找的属性。

cqoc49vn

cqoc49vn2#

一种选择是使用 --files 使用hdfs位置标记和,并确保使用 spark.executor.extraClassPath 标记为 -Dconfig.file :
spark使用以下url方案来允许使用不同的策略来传播JAR:
file:-绝对路径和file:/uri由驱动程序的http文件服务器提供服务,每个执行器从驱动程序http服务器提取文件。
hdfs:、http:、https:、ftp:-这些文件和jar按预期从uri中下拉
local:-以local:/开头的uri应作为本地文件存在于每个工作节点上。这意味着不会产生网络io,对于推送到每个worker或通过nfs、glusterfs等共享的大型文件/jar来说效果很好。
另外,您可以在查看的帮助文档时看到它 spark-submit :

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

使用spark submit运行:

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

相关问题