如何在Spark中设置驱动程序的python版本?


87

我使用的是spark 1.4.0-rc2,因此可以将Python 3与spark一起使用。如果添加export PYSPARK_PYTHON=python3到.bashrc文件,则可以与python 3交互运行spark。但是,如果要在本地模式下运行独立程序,则会收到错误消息:

Exception: Python in worker has different version 3.4 than that in driver 2.7, PySpark cannot run with different minor versions

如何为驱动程序指定python版本?设置export PYSPARK_DRIVER_PYTHON=python3无效。

Answers:


34

您需要确保要启动的独立项目是使用Python 3启动的。如果要通过spark-submit提交独立程序,那么它应该可以正常工作,但是如果要使用python启动它,请确保使用python3来启动您的应用。

另外,请确保已在其中设置了env变量./conf/spark-env.sh(如果不存在,则可以spark-env.sh.template用作基础变量。)


3
@Kevin-我遇到了同样的问题,能否请您发布有关在spark-evn.sh中进行的更改的解决方案。
Dev Patel

1
这是将PATH变量引入Spark的正确方法,而不是修改.bashrc
CᴴᴀZ

为什么需要使用Python 3 @Holden?
jerzy

Spark可以在python2中运行,但是在这种情况下,用户试图在其问题中指定python3。无论是哪个Python版本,都需要一致地完成。
霍顿

79

设置python3PYSPARK_PYTHON=python3PYSPARK_DRIVER_PYTHON=python3两者都适合我。我在.bashrc中使用export进行了此操作。最后,这些是我创建的变量:

export SPARK_HOME="$HOME/Downloads/spark-1.4.0-bin-hadoop2.4"
export IPYTHON=1
export PYSPARK_PYTHON=/usr/bin/python3
export PYSPARK_DRIVER_PYTHON=ipython3
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

我还遵循了本教程,以使其在Ipython3笔记本中运行:http ://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/


5
spark 2.1上与“ IPYTHON = 1”选项有关的错误。错误消息是“在Spark 2.0+中删除了IPYTHON和IPYTHON_OPTS。从环境中删除它们,而是设置PYSPARK_DRIVER_PYTHON和PYSPARK_DRIVER_PYTHON_OPTS。”
notilas

1
PYSPARK_PYTHON=python3设置工人的Python版本,对不对?

如果从PyCharm运行,请添加PYSPARK_PYTHON=python3; PYSPARK_DRIVER_PYTHON=ipython3到“运行”>“编辑配置”>“ {your_run_config}”>“环境变量”。要使这些默认设置为所有运行配置的默认设置,请在“运行”>“编辑配置”>“模板
MisterEd


12

您可以通过在./conf/spark-env.sh文件中设置适当的环境变量来为驱动程序指定Python版本。如果尚不存在,则可以使用spark-env.sh.template提供文件,其中还包含许多其他变量。

这是spark-env.sh设置相关Python环境变量的文件的简单示例:

#!/usr/bin/env bash

# This file is sourced when running various Spark programs.
export PYSPARK_PYTHON=/usr/bin/python3       
export PYSPARK_DRIVER_PYTHON=/usr/bin/ipython

在这种情况下,它将工作人员/执行者使用的Python版本设置为Python3,将Python的驱动程序版本设置为iPython,以便使用更好的shell。

如果您还没有spark-env.sh文件,并且不需要设置任何其他变量,则假定相关python二进制文件的路径正确(使用验证which),那么该变量就可以执行您想要的操作。我有一个类似的问题,此问题已得到解决。


如何运行此文件?
Volatil3

我必须将spark-env.sh.template重命名为spark-env.sh,然后将其添加到文件的末尾导出PYSPARK_PYTHON = / usr / local / bin / python3导出PYSPARK_DRIVER_PYTHON = / usr / local / bin / python3。我不得不弄清楚我的python3在哪儿通过python3
danivicario

10

如果您在较大的组织中运行Spark并且无法更新/spark-env.sh文件,则导出环境变量可能不起作用。

您可以--conf在运行时提交作业时通过该选项添加特定的Spark设置。

pyspark --master yarn --[other settings]\ 
  --conf "spark.pyspark.python=/your/python/loc/bin/python"\ 
  --conf "spark.pyspark.driver.python=/your/python/loc/bin/python"

9

我刚刚遇到了同样的问题,这些是我提供Python版本所遵循的步骤。我想使用Python 2.7而不是2.6运行PySpark作业。

  1. 转到指向的文件夹$SPARK_HOME(以我为例/home/cloudera/spark-2.1.0-bin-hadoop2.7/

  2. 在文件夹下conf,有一个名为的文件spark-env.sh如果您有一个名为的文件spark-env.sh.template,则需要将该文件复制到一个名为的新文件中spark-env.sh

  3. 编辑文件并写下三行

    导出PYSPARK_PYTHON = / usr / local / bin / python2.7

    导出PYSPARK_DRIVER_PYTHON = / usr / local / bin / python2.7

    出口SPARK_YARN_USER_ENV =“ PYSPARK_PYTHON = / usr / local / bin / python2.7”

  4. 保存并再次启动您的应用程序:)

这样,如果下载新的Spark独立版本,则可以设置要运行PySpark的Python版本。


2
请注意,建议cp将文件spark-env.sh.template作为spark-env.sh新文件,然后更改新文件,而不要更改模板的名称和内容。该模板应保留作为参考。
et_l

@et_l是的,我只是考虑到您的评论对答案做了一些修改,谢谢!
selknam

5

我遇到了相同的错误消息,并且尝试了上述三种方法。我列出了这些结果,作为对其他结果的补充参考。

  1. 更改中的PYTHON_SPARKPYTHON_DRIVER_SPARKspark-env.sh对我不起作用。
  2. 更改python脚本中的值os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5" os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"对我不起作用。
  3. ~/.bashrc像魅力一样改变作品的价值〜

花费一个小时后,您的评论是纯金的。谢谢
cheapcoder

非常感谢你。我测试了很多解决方案。你的工作很好。
穆瑟

3

我在IPython中运行它(如Jacek Wasilewski在此链接中所述),并且遇到了这个异常。已添加PYSPARK_PYTHON到IPython内核文件,并使用jupyter notebook运行,并开始工作。

vi  ~/.ipython/kernels/pyspark/kernel.json

{
 "display_name": "pySpark (Spark 1.4.0)",
 "language": "python",
 "argv": [
  "/usr/bin/python2",
  "-m",
  "IPython.kernel",
  "--profile=pyspark",
  "-f",
  "{connection_file}"
 ],

 "env": {
  "SPARK_HOME": "/usr/local/spark-1.6.1-bin-hadoop2.6/",
  "PYTHONPATH": "/usr/local/spark-1.6.1-bin-hadoop2.6/python/:/usr/local/spark-1
.6.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip",
  "PYTHONSTARTUP": "/usr/local/spark-1.6.1-bin-hadoop2.6/python/pyspark/shell.py
",
  "PYSPARK_SUBMIT_ARGS": "--master spark://127.0.0.1:7077 pyspark-shell",
  "PYSPARK_DRIVER_PYTHON":"ipython2",
   "PYSPARK_PYTHON": "python2"
 }

2

我在Windows中的独立Spark上遇到了同样的问题。我的修复版本如下:我将环境变量设置为以下

PYSPARK_SUBMIT_ARGS="pyspark-shell"
PYSPARK_DRIVER_PYTHON=jupyter
PYSPARK_DRIVER_PYTHON_OPTS='notebook' pyspark

使用此设置,我在pyspark上执行了一个Action并得到以下异常:

Python in worker has different version 3.6 than that in driver 3.5, PySpark cannot run with different minor versions.
Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.

要检查我的Spark-Worker使用的是哪个python版本,请在cmd提示符下单击以下命令。

python --version
Python 3.6.3

向我展示了Python 3.6.3。所以很明显我的火花工人正在使用系统Python,即v3.6.3。

现在,当我通过设置将我的spark-driver设置为运行jupyter时,PYSPARK_DRIVER_PYTHON=jupyter我需要检查jupyter使用的python版本。

为此,请打开Anaconda Prompt并点击

python --version
Python 3.5.X :: Anaconda, Inc.

这是jupyter python正在使用v3.5.x的地方。您也可以在任何笔记本中查看此版本(帮助->关于)。

现在我需要更新jupyter蟒蛇版本v3.6.6。为此,请打开Anaconda Prompt并点击

康达搜索python

这将为您提供Anaconda中可用的python版本的列表。安装您所需的

康达安装python = 3.6.3

现在,我同时拥有两个版本3.6.3的Python安装,Spark不应该这样做,而当我在Spark-driver上运行Action时,它并没有这样做。异常消失了。快乐的编码...


1

如果只想更改当前任务的python版本,则可以使用以下pyspark start命令:

    PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..

1

请查看以下代码段:

#setting environment variable for pyspark in linux||ubuntu
#goto --- /usr/local/spark/conf
#create a new file named spark-env.sh copy all content of spark-env.sh.template to it
#then add below lines to it, with path to python

PYSPARK_PYTHON="/usr/bin/python3"
PYSPARK_DRIVER_PYTHON="/usr/bin/python3"
PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser"
#i was running python 3.6 ||run - 'which python' in terminal to find the path of python

发布前请检查模板。
Deepesh Rehi

0

我正在使用以下环境

? python --version; ipython --version; jupyter --version
Python 3.5.2+
5.3.0
5.0.0

以下别名对我来说很好

alias pyspark="PYSPARK_PYTHON=/usr/local/bin/python3 PYSPARK_DRIVER_PYTHON=ipython ~/spark-2.1.1-bin-hadoop2.7/bin/pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11"    
alias pysparknotebook="PYSPARK_PYTHON=/usr/bin/python3 PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS='notebook' ~/spark-2.1.1-bin-hadoop2.7/bin/pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11"

在笔记本中,我如下设置环境

from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()

0

错误

“例外:worker中的Python与驱动程序2.7中的版本2.6不同,PySpark无法以其他次要版本运行”。 

修复(针对Cloudera环境)

  • 编辑此文件: /opt/cloudera/parcels/cdh5.5.4.p0.9/lib/spark/conf/spark-env.sh

  • 添加这些行:

    export PYSPARK_PYTHON=/usr/bin/python
    export PYSPARK_DRIVER_PYTHON=python
    

0

今天在工作中遇到这个问题。管理员认为审慎的做法进行硬编码的Python 2.7的PYSPARK_PYTHONPYSPARK_DRIVER_PYTHON$SPARK_HOME/conf/spark-env.sh。不用说,这破坏了我们利用其他任何python版本或环境的工作(占我们工作的90%以上)。@PhillipStich正确指出,您可能并不总是对此文件具有写权限,就像我们的情况一样。虽然可以在spark-submit调用中设置配置,但是另一个选择(当以yarn / cluster模式运行时)是将SPARK_CONF_DIR环境变量设置为指向另一个配置脚本。在那里,您可以设置PYSPARK_PYTHON以及您可能需要的任何其他选项。可以在github上spark-env.sh源代码中找到一个模板。


0

就我而言(Ubuntu 18.04),我在终端中运行了以下代码:

sudo vim ~/.bashrc

然后SPARK_HOME进行如下编辑:

export SPARK_HOME=/home/muser/programs/anaconda2019/lib/python3.7/site-packages/pyspark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

这样,我SPARK_HOME将引用pyspark我安装在site-package

要了解使用方法vim,请转到链接。


0

跑:

ls -l /usr/local/bin/python*

此示例的第一行显示python3符号链接。要将其设置为默认的python符号链接,请运行以下命令:

ln -s -f /usr/local/bin/python3 /usr/local/bin/python

然后重新加载您的外壳。


0

我遇到了同样的问题,只是忘了激活我的虚拟环境。对于在那里也有精神空白的任何人。


0

如果您使用的是Mac,请使用以下命令

export SPARK_HOME=`brew info apache-spark | grep /usr | tail -n 1 | cut -f 1 -d " "`/libexec
export PYTHONPATH=$SPARK_HOME/python:$PYTHONPATH

export HADOOP_HOME=`brew info hadoop | grep /usr | head -n 1 | cut -f 1 -d " "`/libexec
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native/:$LD_LIBRARY_PATH
export PYSPARK_PYTHON=python3

如果您使用的是其他操作系统,请检查以下链接:https : //github.com/GalvanizeDataScience/spark-install

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.