我提交spark job时可以为python代码添加参数吗?

时间:2015-08-26 02:43:08

标签: python apache-spark cluster-mode

我正在尝试使用spark-submit在spark集群中执行我的python代码。

通常我们使用python代码运行spark-submit,如下所示。

# Run a Python application on a cluster
./bin/spark-submit \
  --master spark://207.184.161.138:7077 \
  my_python_code.py \
  1000

但是我想通过传递几个参数来运行my_python_code.py是否有智能的方法来传递参数?

5 个答案:

答案 0 :(得分:27)

:将其放在名为args.py

的文件中
#import sys
print sys.argv

如果你跑

spark-submit args.py a b c d e 

你会看到:

['/spark/args.py', 'a', 'b', 'c', 'd', 'e']

答案 1 :(得分:27)

即使sys.argv是一个很好的解决方案,我仍然更喜欢在PySpark作业中处理行命令args的这种更正确的方法:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--ngrams", help="some useful description.")
args = parser.parse_args()
if args.ngrams:
    ngrams = args.ngrams

这样,您可以按如下方式启动工作:

spark-submit job.py --ngrams 3

有关argparse模块的详细信息,请参阅Argparse Tutorial

答案 2 :(得分:0)

啊,这是可能的。 http://caen.github.io/hadoop/user-spark.html

spark-submit \
    --master yarn-client \   # Run this as a Hadoop job
    --queue <your_queue> \   # Run on your_queue
    --num-executors 10 \     # Run with a certain number of executors, for example 10
    --executor-memory 12g \  # Specify each executor's memory, for example 12GB
    --executor-cores 2 \     # Specify each executor's amount of CPUs, for example 2
    job.py ngrams/input ngrams/output

答案 3 :(得分:0)

您可以从spark-submit命令传递参数,然后以以下方式在代码中访问它们,

sys.argv [1]将为您提供第一个参数,sys.argv [2]将为您提供第二个参数,依此类推。请参考以下示例,

您可以创建以下代码,以接受将在spark-submit命令中传递的参数,

import os
import sys

n = int(sys.argv[1])
a = 2
tables = []
for _ in range(n):
    tables.append(sys.argv[a])
    a += 1
print(tables)

将以上文件另存为PysparkArg.py并执行以下spark-submit命令,

spark-submit PysparkArg.py 3 table1 table2 table3

输出:

['table1', 'table2', 'table3']

这段代码可用于需要从数据库中获取多个表的PySpark作业中,并且在执行spark-submit命令时,用户将获取要获取的表数和表名

答案 4 :(得分:0)

Aniket Kulkarni的spark-submit args.py a b c d e足够了,但是值得一提的是,我们在使用可选的/命名的参数(例如--param1)时遇到了问题。

看来,双破折号--将有助于表明遵循以下python可选参数:

spark-submit --sparkarg xxx yourscript.py -- --scriptarg 1 arg1 arg2