现在我想在一个集群中用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)
...
为了达到同样的结果,我发现了以下几点:
conf.addfile()
。因此,除非您能够在检索文件之前运行hdfs dfs-get<...>
,否则hdfs文件将无法工作。在我的例子中,我想从oozie运行它,所以我不知道它将在哪台机器上运行,而且我不想在我的工作流中添加复制文件操作。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)使用该命令: 而且奏效了