我使用time-start
运行使用Java实现的Spark作业。我想将参数传递给这份工作 - 例如一个time-end
和--conf key=value
参数,用于参数化Spark应用程序。
我尝试的是使用
spark-submit
sparkContext.getConf().get("key")
脚本的选项,但是当我尝试使用
读取Spark作业中的参数时Exception in thread "main" java.util.NoSuchElementException: key
我得到一个例外:
sparkContext.getConf().toDebugString()
此外,当我使用{{1}}时,我在输出中看不到我的值。
进一步注意由于我想通过Spark REST服务提交Spark作业,因此无法使用OS环境变量等。
有可能实现这个吗?
答案 0 :(得分:4)
由于您要使用自定义属性,因此您需要在application.jar
spark-submit
之后放置属性(例如,火花示例[application-arguments]
应该是您的属性。--conf
应该是火花配置属性。
- conf:以key = value格式的任意 Spark配置属性。对于包含空格的值,用引号括起“key = value”(如图所示)。
./bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # options
<application-jar> \
[application-arguments] <--- here our app arguments
所以,当您执行spark-submit .... app.jar key=value
方法main
时,您将获得args[0]
key=value
。
public static void main(String[] args) {
String firstArg = args[0]; //eq. to key=value
}
但你想使用key value
对,你需要以某种方式解析你的app arguments
。
您可以查看Apache Commons CLI library或其他替代方法。
答案 1 :(得分:2)
Spark配置将仅使用spark
命名空间中的键。如果您不想使用独立配置工具,可以尝试:
--conf spark.mynamespace.key=value
答案 2 :(得分:1)
你可以传递这样的参数:
./bin/spark-submit \
--class $classname \
--master XXX \
--deploy-mode XXX \
--conf XXX \
$application-jar --**key1** $**value** --**key2** $**value2**\
请务必使用适当的值替换key1
,key2
和value
。