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

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

叶桐
2023-03-14

现在我想在一个集群中用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参数试过了,但也不起作用。有没有人知道我该怎么解决这个问题?

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

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)
...

共有1个答案

陈鸿才
2023-03-14

为了达到同样的结果,我发现了以下几点:

  1. --files:仅与运行spark-submit命令的计算机上的本地文件关联,并转换为conf.addfile()。因此,除非您能够在检索文件之前运行hdfs dfs-get<...>,否则hdfs文件将无法工作。在我的例子中,我想从oozie运行它,所以我不知道它将在哪台机器上运行,而且我不想在我的工作流中添加复制文件操作。
  2. @yuval_itzchakov引用的引用是指--jars,因为它将转换为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)
}
 类似资料:
  • 我们正在EC2实例上构建一个airflow服务器,该服务器与EMR集群通信以运行spark作业。我们试图提交一个BashOperator DAG,它为一个简单的wordcount应用程序运行spark-submit命令。下面是我们的spark提交命令: 我们得到以下错误:线程“main”org.apache.spark.sparkException中的异常:当使用主“yarn”运行时,必须在环境中

  • 抛出错误 到目前为止,我在Hadoop中只有start-dfs.sh,在Spark中并没有真正配置任何内容。我是否需要使用YARN集群管理器来运行Spark,以便Spark和Hadoop使用相同的集群管理器,从而可以访问HDFS文件? 我尝试按照tutorialspoint https://www.tutorialspoint.com/Hadoop/hadoop_enviornment_setup

  • 是的...已经讨论了很多了。 但是,有很多不明确的地方,提供了一些答案...包括在jars/executor/driver配置或选项中重复jar引用。 类路径的影响 驱动程序 执行程序(用于正在运行的任务) 两者 一点也不 对于任务(对每个执行者) 用于远程驱动程序(如果在群集模式下运行) 方法 方法 或 或 不要忘记,spark-submit的最后一个参数也是一个.jar文件。 如果我从文档中猜

  • 我正在尝试在我的Spark应用程序中使用多个(通过include)类型安全配置文件,我正在集群模式下提交给一个YARN队列。我基本上有两个配置文件,下面提供了文件布局: null 上面的两个文件都是我的application.jar的外部文件,所以我使用“--files”(可以在下面看到)将它们传递给yarn 我正在使用Typesafe配置库来解析我的“application-main.conf”

  • 我正在尝试从本地机器终端向我的集群提交一个Spark应用程序。我正在使用。我也需要在我的集群上运行驱动程序,而不是在我提交应用程序的机器上,即我的本地机器上 当我提供到本地机器中的应用程序jar的路径时,spark-submit会自动上传到我的集群吗? 我在用 和获取错误

  • 现在k8s在2.3中直接与spark集成了,我的spark submit从控制台在kuberenetes master上正确执行,而没有运行任何spark master pods,spark处理k8s的所有细节: 我正在尝试做的是做一个火花-提交通过AWS lambda到我的k8s集群。以前,我直接通过spark master REST API(不使用kubernetes)使用该命令: 而且奏效了