使用spark-submit和python main

Xap*_*Mnu 7 apache-spark pyspark

阅读这个,让我觉得有可能有​​一个python文件被执行spark-submit但是我无法让它工作.

我的设置有点复杂.我需要与我的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)
Run Code Online (Sandbox Code Playgroud)

我已将我的python文件打包在一个egg中,而egg包含主文件,这使得egg可以通过调用来执行 python myegg.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
Run Code Online (Sandbox Code Playgroud)

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

小智 8

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

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

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

./spark-submit --jars jar1.jar,jar2.jar --py-files path/to/my/egg.egg driver.py arg1 arg
Run Code Online (Sandbox Code Playgroud)

驱动程序将是这样的 -

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

if __name__ == '__main__':
    conf = SparkConf().setAppName("app")
    sc = SparkContext(conf=conf)
    myfn(myargs, sc)
Run Code Online (Sandbox Code Playgroud)

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