在Python Shell中导入Pyspark

134

以下是别人在另一个论坛上从未得到答案的问题,我想在这里重新问一下,因为我也有同样的问题。(请参见http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736)

我已经在我的电脑上正确安装了Spark,并且能够使用./bin/pyspark作为Python解释器来运行带有pyspark模块的Python程序而不出错。

然而,当我尝试运行常规Python shell时,当我尝试导入pyspark模块时,我会得到以下错误:

from pyspark import SparkContext

它说:

"No module named pyspark".

如何解决这个问题?我需要设置一个环境变量来指向Python所需的pyspark headers/libraries等吗?如果我的spark安装在/spark/下,我需要包括哪些pyspark路径?或者pyspark程序只能从pyspark解释器中运行吗?


他们说改变环境变量"不是特别有效,因为它很快被bin/spark-submit覆盖掉了。" 也许你可以从这个交流中学到一些东西 - emmagras
20个回答

119

假设您满足以下条件之一:

  • Spark已经下载在您的系统上,并且您有一个环境变量SPARK_HOME指向它
  • 您运行了pip install pyspark

这是一个简单的方法(如果你不关心它是如何工作的!!!)

使用 findspark

  1. 进入您的 Python shell

pip install findspark

import findspark
findspark.init()
  • 导入必要的模块

    from pyspark import SparkContext
    from pyspark import SparkConf
    
  • 完成啦!!!


  • 1
    其他解决方案对我没有用。目前我在我的程序中使用findspark。看起来是一个不错的解决问题的方法。 - Analytical Monk
    2
    我宁愿不这样做...但是,鉴于没有其他办法...我会接受它。 - WestCoastProjects

    55

    如果打印出这样的错误:

    ImportError: No module named py4j.java_gateway

    请将 $SPARK_HOME/python/build 添加到 PYTHONPATH 中:

    export SPARK_HOME=/Users/pzhang/apps/spark-1.1.0-bin-hadoop2.4
    export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH
    

    10
    如另一个回答所述:https://dev59.com/uF8d5IYBdhLWcg3wtz8Q,我不得不添加以下内容:export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH - meyerson

    52

    原来pyspark bin正在加载Python并自动加载正确的库路径。请查看$SPARK_HOME/bin/pyspark

    export SPARK_HOME=/some/path/to/apache-spark
    # Add the PySpark classes to the Python path:
    export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
    
    我已将此行代码添加到我的 .bashrc 文件中,现在模块被正确地找到了!

    1
    除了这一步,我还需要添加:export SPARK_HOME=~/dev/spark-1.1.0,你懂的。你的文件夹名称可能会有所不同。 - emmagras

    25

    通过导出SPARK路径和Py4j路径,它开始工作:

    export SPARK_HOME=/usr/local/Cellar/apache-spark/1.5.1
    export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH
    PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH 
    export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH
    

    因此,如果您不想每次启动Python shell时都键入这些内容,您可能希望将其添加到您的.bashrc文件中。


    1
    我在我的Apache Spark安装中找不到libexec目录,有什么想法吗? - Alberto Bonsanto
    @AlbertoBonsanto 抱歉,我没有遇到过这个问题。所以,不知道 :( - Dawny33
    2
    是的,他们在Spark 1.5.2中删除了libexec文件夹。 - bluerubez
    1
    @bluerubez 似乎在Spark 1.6.2中存在...另外,不确定libexec/python/build目录的用途是什么,但Spark 1.6.2没有该目录。 - OneCricketeer

    25

    1
    有人能详细解释一下为什么不这样做吗?我一直在研究这个问题,但到目前为止还没有找到任何解释为什么不能这样做的资料。 - Mint
    1
    @Mint 其他回答已经解释了原因:pyspark 包默认并没有在 $PYTHONPATH 中包含,因此在命令行或执行的脚本中导入 import pyspark 将会失败。你必须要么按照预期通过 spark-submit 运行 pyspark,要么将 $SPARK_HOME/python 添加到 $PYTHONPATH 中。 - kingledion
    1
    另一个要点是spark-submit是一个shell脚本,它可以帮助你在使用spark之前正确配置系统环境。如果你只是运行python main.py,你需要正确配置系统环境,例如PYTHONPATH、SPARK_HOME等。 - E.ZY.

    18
    在Mac上,我使用Homebrew来安装Spark(公式为“apache-spark”)。然后我这样设置PYTHONPATH,以便Python导入可以正常工作:
    export SPARK_HOME=/usr/local/Cellar/apache-spark/1.2.0
    export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH
    

    在您的Mac上,将“1.2.0”替换为实际的Apache Spark版本。


    16

    在pyspark中执行Spark需要同时使用两个组件:

    • pyspark Python包
    • 运行在JVM中的Spark实例

    当使用spark-submit或者pyspark启动脚本时,它们会处理两个组件,即设置PYTHONPATH、PATH等环境变量使得你的脚本可以找到pyspark,并且它们还会启动Spark实例,并根据你的参数进行配置,例如 --master X。

    另外一种方法是绕过这些脚本,在Python解释器中直接运行你的Spark应用程序,例如python myscript.py。当Spark脚本变得更加复杂并最终接收自己的args时,这种方式尤为有趣。

    1. 确保Python解释器可以找到pyspark包。如前所述,可以将spark/python目录添加到PYTHONPATH中,或者使用pip install直接安装pyspark。
    2. 从你的脚本中设置Spark实例的参数(曾经传递给pyspark的参数)。
      • 对于像使用--conf设置的Spark配置,可以在SparkSession.builder.config的config对象(或字符串configs)中定义。
      • 对于主要选项(如--master或--driver-mem),目前可以通过编写PYSPARK_SUBMIT_ARGS环境变量来设置它们。为了使事情更加清晰和安全,你可以从Python本身中设置它,并且Spark启动时会读取它。
    3. 启动实例,只需要从builder对象中调用getOrCreate()方法即可。

    因此,你的脚本可以如下所示:

    from pyspark.sql import SparkSession
    
    if __name__ == "__main__":
        if spark_main_opts:
            # Set main options, e.g. "--master local[4]"
            os.environ['PYSPARK_SUBMIT_ARGS'] = spark_main_opts + " pyspark-shell"
    
        # Set spark config
        spark = (SparkSession.builder
                 .config("spark.checkpoint.compress", True)
                 .config("spark.jars.packages", "graphframes:graphframes:0.5.0-spark2.1-s_2.11")
                 .getOrCreate())
    

    12
    为了解决 ImportError: No module named py4j.java_gateway 错误,您需要添加以下内容:
    import os
    import sys
    
    
    os.environ['SPARK_HOME'] = "D:\python\spark-1.4.1-bin-hadoop2.4"
    
    
    sys.path.append("D:\python\spark-1.4.1-bin-hadoop2.4\python")
    sys.path.append("D:\python\spark-1.4.1-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip")
    
    try:
        from pyspark import SparkContext
        from pyspark import SparkConf
    
        print ("success")
    
    except ImportError as e:
        print ("error importing spark modules", e)
        sys.exit(1)
    

    8
    在Windows 10上,以下方法适用于我。我通过使用“设置”>“编辑帐户的环境变量”添加了以下环境变量:
    SPARK_HOME=C:\Programming\spark-2.0.1-bin-hadoop2.7
    PYTHONPATH=%SPARK_HOME%\python;%PYTHONPATH%
    

    请将“C:\Programming\...”更改为您安装Spark的文件夹。


    5
    对于Linux用户,以下是正确的(非硬编码)将pyspark库包含在PYTHONPATH中的方法。两个路径部分都是必需的:
    1. pyspark Python模块的路径,以及
    2. 当导入pyspark模块时所依赖的压缩库的路径
    请注意下面的zipped library版本是动态确定的,因此我们不会进行硬编码。
    export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接