【问题标题】:Passing command line arguments to Spark-shell将命令行参数传递给 Spark-shell
【发布时间】:2015-04-28 20:12:27
【问题描述】:

我有一个用 scala 编写的 spark 作业。我用

spark-shell -i <file-name>

运行作业。我需要将命令行参数传递给作业。现在,我通过一个 linux 任务调用脚本,我在其中做

export INPUT_DATE=2015/04/27 

并使用环境变量选项来访问值:

System.getenv("INPUT_DATE")

有没有更好的方法来处理 Spark-shell 中的命令行参数?

【问题讨论】:

  • 为什么要在 spark-shell 中传递参数?!?为什么不使用 spark-submit 脚本正常运行作业??
  • 仍在运行 0.9.1in CDH 4.6。 spark-submit 尚不可用。
  • 如果您只运行 2 行 scala 代码,您想要这样做的另一个原因是避免构建项目的麻烦。请参阅下面关于我如何解决此问题的答案。

标签: apache-spark


【解决方案1】:

我的解决方案是使用自定义键而不是 spark.driver.extraJavaOptions 来定义参数,以防万一有一天您传入的值可能会干扰 JVM 的行为。

spark-shell -i your_script.scala --conf spark.driver.args="arg1 arg2 arg3"

您可以像这样在 Scala 代码中访问参数:

val args = sc.getConf.get("spark.driver.args").split("\\s+")
args: Array[String] = Array(arg1, arg2, arg3)

【讨论】:

  • 不错。比spark.driver.extraJavaOptions 稍微干净一点。
  • 其实你可以用 -conf spark.driver.arg1 -conf spark.driver.arg2 做一些更简单的事情,似乎所有以 spark.driver 为前缀的配置都会传递给驱动程序
【解决方案2】:

简答:

spark-shell -i &lt;(echo val theDate = $INPUT_DATE ; cat &lt;file-name&gt;)

长答案:

此解决方案导致在传递给spark-submit之前在文件开头添加以下行:

val theDate = ...,

从而定义一个新变量。这样做的方式(&lt;( ... ) 语法)称为进程替换。它在 Bash 中可用。请参阅 this question 了解更多信息,以及非 Bash 环境的替代方案(例如 mkFifo)。

使这更系统化:

将下面的代码放入脚本中(例如spark-script.sh),然后就可以简单地使用了:

./spark-script.sh your_file.scala first_arg second_arg third_arg, 并有一个名为 argsArray[String] 与您的论点。

文件spark-script.sh

scala_file=$1

shift 1

arguments=$@

#set +o posix  # to enable process substitution when not running on bash 

spark-shell  --master yarn --deploy-mode client \
         --queue default \
        --driver-memory 2G --executor-memory 4G \
        --num-executors 10 \
        -i <(echo 'val args = "'$arguments'".split("\\s+")' ; cat $scala_file)

【讨论】:

  • 有更好的方法吗?我可以传递如下参数吗: spark-shell -i script.scala args1 args2;这样在 scala 文件中,我可以检索像 args(1)、args(2) 这样的参数。这是来自alvinalexander.com/scala/… 的 Scala 解决方案。但是,它在 spark-shell 中不起作用。你有什么建议吗?
【解决方案3】:

我使用extraJavaOptions 当我有一个 scala 脚本太简单而无法完成构建过程但我仍然需要向它传递参数时。它并不漂亮,但它很有效,你可以快速传递多个参数:

spark-shell -i your_script.scala --conf spark.driver.extraJavaOptions="-Darg1,arg2,arg3"

注意-D不属于arg1arg2arg3这几个参数。然后,您可以从 scala 代码中访问参数,如下所示:

val sconf = new SparkConf()

// load string
val paramsString = sconf.get("spark.driver.extraJavaOptions")

// cut off `-D`
val paramsSlice = paramsString.slice(2,paramsString.length)

// split the string with `,` as delimiter and save the result to an array
val paramsArray = paramsSlice.split(",")

// access parameters
val arg1 = paramsArray(0)

【讨论】:

  • 包含导入语句:import org.apache.spark.SparkConf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多