将命令行参数传递给Spark-shell

Jee*_*evs 14 apache-spark

我有一个用scala编写的spark工作.我用

spark-shell -i <file-name>
Run Code Online (Sandbox Code Playgroud)

跑这份工作.我需要将命令行参数传递给作业.现在,我通过linux任务调用脚本,我在那里

export INPUT_DATE=2015/04/27 
Run Code Online (Sandbox Code Playgroud)

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

System.getenv("INPUT_DATE")
Run Code Online (Sandbox Code Playgroud)

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

sou*_*ine 24

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

spark-shell -i your_script.scala --conf spark.driver.args="arg1 arg2 arg3"
Run Code Online (Sandbox Code Playgroud)

您可以在scala代码中访问参数,如下所示:

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


Ami*_*mir 21

简短回答:

spark-shell -i <(echo val theDate = $INPUT_DATE ; cat <file-name>)

答案很长:

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

val theDate = ...,

从而定义一个新变量.这样做的方式(<( ... )语法)称为进程替换.它可以在Bash中使用.有关此问题的更多信息,请参阅此问题,有关mkFifo非Bash环境的替代方案(例如),请参阅此问题.

使这更加系统化:

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

./spark-script.sh your_file.scala first_arg second_arg third_arg,并有一个Array[String]args你的论点.

文件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)
Run Code Online (Sandbox Code Playgroud)


Nic*_*ico 5

我使用的是extraJavaOptions当我有一个scala脚本时,它太简单了,无法完成构建过程,但我仍然需要将参数传递给它.它不漂亮,但它可以工作,你可以快速传递多个参数:

spark-shell -i your_script.scala --conf spark.driver.extraJavaOptions="-Darg1,arg2,arg3"
Run Code Online (Sandbox Code Playgroud)

请注意,-D不属于参数,这些参数arg1,arg2arg3.然后,您可以在scala代码中访问参数,如下所示:

val sconf = new SparkConf()
val paramsString = sconf.get("spark.driver.extraJavaOptions")
val paramsSlice = paramsString.slice(2,paramsString.length)
val paramsArray = paramsSlice.split(",")
val arg1 = paramsArray(0)
Run Code Online (Sandbox Code Playgroud)

在第二行中,加载字符串,在第三行中,切断-D,在第四行中,使用,as delimiter 拆分字符串并将结果保存到数组中.然后,您可以访问第五行中的参数.