【问题标题】:Using spark-submit with python main将 spark-submit 与 python main 一起使用
【发布时间】:2020-01-23 16:14:32
【问题描述】:

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

我的设置有点复杂。我需要将几个不同的 jar 与我的 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包含主文件,这使得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

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

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    一种方法是将 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
    

    驱动程序类似于 -

    from pyspark import SparkContext, SparkConf
    from my-module import myfn
    
    if __name__ == '__main__':
        conf = SparkConf().setAppName("app")
        sc = SparkContext(conf=conf)
        myfn(myargs, sc)
    

    在必要时将SparkContext 对象作为参数传递。

    【讨论】:

    • 谢谢。我刚刚想通了。然而,它只适用于我的本地机器,而不适用于 Map reduce 集群;/ 由于某种原因,一旦我提供带有额外 jar 的 --driver-class-path 选项,我会覆盖默认的(我认为),结果出现错误py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext. : java.lang.NoSuchMethodError: org.apache.http.impl.client.DefaultHttpClient.execute(Lorg/apache/http/client/methods/HttpUriRequest;)Lorg/apache/http/client/methods/CloseableHttpResponse; 想法?
    • 如果不查看您的实际程序和环境变量,恐怕很难分析这种情况下的确切问题
    • 问题是我的 fat jar 和 spark jar 的版本之间存在版本冲突。感谢您的帮助!
    • 此代码是否必须在驱动程序本身上运行?它可以在另一台机器上运行并以任何方式在驱动程序上执行某些操作吗?
    • 我已经创建了 .egg 文件和我的主文件(driver.py)文件,现在我正在尝试使用命令(spark-submit --py-files local: ///C:/git_local/sparkETL/dist/sparkETL-0.1-py3.6.egg driver.py )但我收到错误(找不到文件 c:\spark\bin\driver.py)。现在我很困惑我已经创建了 egg 文件现在它应该在 .egg 中查找 driver.py 但是为什么它在本地路径中查找请帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2019-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    相关资源
    最近更新 更多