我可以在提交 spark 作业时向 python 代码添加参数吗?
Can I add arguments to python code when I submit spark job?
我正在尝试使用 spark-submit
在 spark 集群中执行我的 python 代码。
通常我们 运行 spark-submit
使用如下 python 代码。
# 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
通过传递几个参数有没有聪明的方法来传递参数?
啊,这是可能的。 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
是:将其放入名为 args.py
的文件中
#import sys
print sys.argv
如果你运行
spark-submit args.py a b c d e
您将看到:
['/spark/args.py', 'a', 'b', 'c', 'd', 'e']
尽管 sys.argv
是一个很好的解决方案,但我仍然更喜欢这种在我的 PySpark 作业中处理行命令参数的更正确的方法:
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
您可以从 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 作业中,需要从数据库中获取多个 tables,要获取的 tables 的数量和 table 名称将由用户在执行 spark-submit 命令时给出。
Aniket Kulkarni 的 spark-submit args.py a b c d e
似乎就足够了,但值得一提的是我们在 optional/named args(例如 --param1)方面遇到了问题。
看来双破折号 --
将有助于表示 python 可选参数如下:
spark-submit --sparkarg xxx yourscript.py -- --scriptarg 1 arg1 arg2
我正在尝试使用 spark-submit
在 spark 集群中执行我的 python 代码。
通常我们 运行 spark-submit
使用如下 python 代码。
# 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
通过传递几个参数有没有聪明的方法来传递参数?
啊,这是可能的。 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
是:将其放入名为 args.py
的文件中#import sys
print sys.argv
如果你运行
spark-submit args.py a b c d e
您将看到:
['/spark/args.py', 'a', 'b', 'c', 'd', 'e']
尽管 sys.argv
是一个很好的解决方案,但我仍然更喜欢这种在我的 PySpark 作业中处理行命令参数的更正确的方法:
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
您可以从 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 作业中,需要从数据库中获取多个 tables,要获取的 tables 的数量和 table 名称将由用户在执行 spark-submit 命令时给出。
Aniket Kulkarni 的 spark-submit args.py a b c d e
似乎就足够了,但值得一提的是我们在 optional/named args(例如 --param1)方面遇到了问题。
看来双破折号 --
将有助于表示 python 可选参数如下:
spark-submit --sparkarg xxx yourscript.py -- --scriptarg 1 arg1 arg2