使用spark-submit和python main

时间:2016-06-30 10:07:25

标签: apache-spark pyspark

thisthis阅读让我觉得有可能让spark-submit执行python文件,但是我无法让它工作。

我的设置有点复杂。我需要与我的python文件一起提交几个不同的罐子,以便一切运行。我的pyspark命令有效:

IPYTHON=1 ./pyspark --jars jar1.jar,/home/local/ANT/bogoyche/dev/rhine_workspace/env/Scala210-1.0/runtime/Scala2.10/scala-library.jar,jar2.jar --driver-class-path jar1.jar:jar2.jar
from sys import path
path.append('my-module')
from my-module import myfn
myfn(myargs)

我已将我的python文件打包在一个egg中,而egg包含主文件,通过调用python myegg.egg

使egg可执行

我现在正在尝试形成我的spark-submit命令,但我似乎无法做到正确。我在哪里:

./spark-submit --jars jar1.jar,jar2.jar --py-files path/to/my/egg.egg arg1 arg
Error: Cannot load main class from JAR file:/path/to/pyspark/directory/arg1
Run with --help for usage help or --verbose for debug output

而不是执行我的.egg文件,它取出了egg的第一个参数并将其视为jar文件并尝试从中加载一个类?我做错了什么?

1 个答案:

答案 0 :(得分:8)

其中一种方法是将Spark应用程序的主驱动程序作为必须传递给spark-submit的python文件(.py)。此主脚本具有帮助驱动程序识别入口点的主要方法。此文件将自定义配置属性初始化SparkContext。

egg可执行文件中捆绑的那些是依赖项,它们被发送到执行程序节点并导入到驱动程序中。

您可以将小文件编写为主驱动程序并执行 -

./spark-submit --jars jar1.jar,jar2.jar --py-files path/to/my/egg.egg driver.py arg1 arg

驱动程序类似于 -

from pyspark import SparkContext, SparkConf
from my-module import myfn

if __name__ == '__main__':
    conf = SparkConf().setAppName("app")
    sc = SparkContext(conf=conf)
    myfn(myargs, sc)

在必要时将spark上下文对象作为参数传递。