在 Python 脚本中使用 pyspark

这是另一个论坛上其他人的问题的副本,从来没有得到回答,所以我想我应该在这里重新问它,因为我有同样的问题。(见 http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736)

我已经在我的机器上正确地安装了 Spark,并且在使用的时候能够使用 pypark 模块运行 Python 程序而没有错误。/bin/pypark 作为我的 Python 解释器。

然而,当我尝试运行常规的 Python shell 时,当我尝试导入 pypark 模块时,我得到了这个错误:

from pyspark import SparkContext

上面写着

"No module named pyspark".

我该怎么补救?是否需要设置一个环境变量将 Python 指向 headers/libraries/etc?如果我的 Spark 安装目录是/spark/,我需要包含哪些 pyspark 路径?或者只能在 pypark 解释器上运行 pypark 程序?

209197 次浏览

结果显示 pypark 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 文件中,现在可以正确地找到模块了!

如果打印出这样的错误:

Import Error: 没有名为 py4j.java _ gate 的模块

请将 $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

在 Mac 上,我使用 Homebrew 来安装 Spark (公式“ apache-park”)。然后,我以这种方式设置 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

将“1.2.0”替换为 Mac 上实际的 apache-parks 版本。

不要以 python filename.py的方式运行 py 文件 代替使用: spark-submit filename.py

资料来源: https://spark.apache.org/docs/latest/submitting-applications.html

通过导出 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文件中

假设下列情况之一:

  • 火花已经下载到你的系统中,你有一个环境变量的 SPARK_HOME指向它
  • 你运行了 pip install pyspark

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

使用 找到火花

  1. 去你的蟒蛇壳

    pip install findspark
    
    
    import findspark
    findspark.init()
    
  2. 导入必要的模块

    from pyspark import SparkContext
    from pyspark import SparkConf
    
  3. 成交! ! !

之所以出现这个错误,是因为我试图提交的 Python 脚本名为 pyparks. py (手掌)。修复的方法是按照上面的建议设置我的 PYTHONPATH,然后将脚本重命名为 pypark _ test.py,并清除基于我的脚本原始名称创建的 pyparks. pyc,这样就清除了这个错误。

以 DSE (DataStax Cassandra & Spark)为例 需要将以下位置添加到 PYTHONPATH

export PYTHONPATH=/usr/share/dse/resources/spark/python:$PYTHONPATH

然后使用 dse pypark 获得路径中的模块。

dse pyspark

我也遇到了同样的问题,我想在上面提出的解决方案中加上一点。在 Mac OS X 上使用 Homebrew 安装 Spark 时,需要更正 py4j 路径地址,以便在路径中包含 libexec (记住将 py4j 版本更改为已有的版本) ;

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH

要去掉 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)

在 Windows10上,我使用 设定 > 为您的帐户编辑环境变量添加了以下环境变量:

SPARK_HOME=C:\Programming\spark-2.0.1-bin-hadoop2.7
PYTHONPATH=%SPARK_HOME%\python;%PYTHONPATH%

(将“ C: Programming...”更改为您已安装“火花”的文件夹)

对于 Linux 用户来说,以下是在 PYTHONPATH 包含 pypark libaray 的正确(且非硬编码)方式。PATH 的两个部分都是必要的:

  1. Python 模块本身的路径,以及
  2. 当导入 pypark 模块时,该模块所依赖的压缩库的路径

请注意,下面的压缩库版本是动态确定的,因此我们不硬编码它。

export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}

我正在 CentOS VM 上运行一个火花集群,它是从 Cloudera yum 软件包安装的。

必须设置以下变量才能运行 pypark。

export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

这就是我在 Spark 中使用我的 Anaconda 发行版所做的。 这是火花版本独立。 您可以将第一行更改为用户的 Python bin。 此外,从 Spark 2.2.0开始,PySpark 可以作为 PyPi 上的独立包使用 但我还没有测试出来。

我也有同样的问题。

还要确保您使用的是正确的 python 版本,并且正在使用正确的 pip 版本安装它。在我的例子中: 我同时拥有 python 2.7和3.x。 我已经安装了火花

安装火花管2.7

成功了。

对于火花中的火花执行,需要两个组件协同工作:

  • pyspark蟒蛇软件包
  • JVM 中的火花实例

当启动具有星火提交或火花的东西,这些脚本将照顾两者,即他们设置您的 PYTHONPATH,PATH 等,以便您的脚本可以找到火花,他们也启动火花实例,配置根据您的参数,例如-master X

或者,也可以绕过这些脚本,直接在 python 解释器(如 python myscript.py)中运行火花应用程序。当火花脚本开始变得更加复杂并最终接收到它们自己的参数时,这尤其有趣。

  1. 确保 Python 解释器可以找到 pypark 包。正如已经讨论过的,要么将 park/python 目录添加到 PYTHONPATH,要么使用 pip install 直接安装 pypark。
  2. 从脚本中设置 park 实例的参数(那些曾经传递给 pypark 的参数)。
    • 对于通常使用—— conf 设置的火花配置,它们是在 SparkSession.builder.config 中用 config 对象(或字符串 configs)定义的
    • 对于目前的主选项(比如—— master 或者—— Driver-mem) ,您可以通过写入 PYSPARK _ SUBMIT _ ARGS 环境变量来设置它们。为了使事情变得更简洁和更安全,您可以从 Python 本身中设置它,并且在启动时 park 将读取它。
  3. 启动实例,这只需要您从构建器对象调用 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())

您还可以创建一个 Docker 容器,使用 Alpine 作为操作系统,使用 Python 和 Pypark 作为安装包。这样就能把所有东西都装进集装箱了。

在我的例子中,它是在另一个 python dist _ package (python 3.5)上安装的,而我使用的是 python 3.6, 因此,以下几点有所帮助:

python -m pip install pyspark

您可以使用 pip获得 python 中的 pyspark path(如果您已经使用 PIP 安装 pypark) ,如下所示

pip show pyspark
!pip install pyspark

在 Jupyter 笔记本电脑或谷歌 colab。不要忘记做 abc0列在 colab 笔记本电脑的顶部