【问题标题】:How to pass parameters / properties to Spark jobs with spark-submit如何使用 spark-submit 将参数/属性传递给 Spark 作业
【发布时间】:2017-03-24 22:27:38
【问题描述】:

我正在运行一个使用spark-submit 在 Java 中实现的 Spark 作业。我想将参数传递给这项工作 - 例如一个 time-starttime-end 参数来参数化 Spark 应用程序。

我尝试的是使用

--conf key=value

spark-submit 脚​​本的选项,但是当我尝试使用

读取 Spark 作业中的参数时
sparkContext.getConf().get("key")

我得到一个例外:

Exception in thread "main" java.util.NoSuchElementException: key

此外,当我使用 sparkContext.getConf().toDebugString() 时,我在输出中看不到我的值。

进一步通知由于我想通过 Spark REST 服务提交我的 Spark 作业,我不能使用操作系统环境变量等。

有没有可能实现这个?

【问题讨论】:

标签: java apache-spark command-line


【解决方案1】:

由于您想使用自定义属性,您需要将属性放在 spark-submit 中的 application.jar 之后(如在 spark 示例中,[application-arguments] 应该是您的属性。--conf 应该是 spark 配置属性。

--conf:任意 Spark 配置属性,采用 key=value 格式。对于包含空格的值,将“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=valuemain 方法中你会得到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 或其他选项。

【讨论】:

    【解决方案2】:

    Spark 配置将仅使用 spark 命名空间中的键。如果你不会使用独立的配置工具,你可以试试:

    --conf spark.mynamespace.key=value
    

    【讨论】:

      【解决方案3】:

      你可以像这样传递参数:

      ./bin/spark-submit \
        --class $classname \
        --master XXX \
        --deploy-mode XXX \
        --conf XXX \
        $application-jar --**key1** $**value** --**key2** $**value2**\
      

      确保将key1key2value 替换为正确的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-22
        • 2014-05-07
        • 2016-03-01
        • 2015-03-25
        • 2016-06-17
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        相关资源
        最近更新 更多