如何在 spark 中设置驱动程序的 python 版本?
How do I set the driver's python version in spark?
我正在使用 spark 1.4.0-rc2,因此我可以将 python 3 与 spark 一起使用。如果我将 export PYSPARK_PYTHON=python3
添加到我的 .bashrc
文件中,我可以 运行 与 python 3 进行交互。但是,如果我想 运行 本地的独立程序模式,我得到一个错误:
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
无效。
您需要确保您启动的独立项目是使用 Python 启动的 3. 如果您通过 spark-submit 提交您的独立程序,那么它应该可以正常工作,但如果您正在启动它使用 python 确保您使用 python3 启动您的应用程序。
此外,请确保您已在 ./conf/spark-env.sh
中设置环境变量(如果不存在,您可以使用 spark-env.sh.template
作为基础。)
您可以通过在 ./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
在这种情况下,它将 workers/executors 使用的 Python 版本设置为 Python3,并将 Python 的驱动程序版本设置为 iPython一个更好的 shell 工作环境。
如果您还没有 spark-env.sh
文件,并且不需要设置任何其他变量,那么这个应该可以满足您的要求,假设相关 python 的路径二进制文件是正确的(用 which
验证)。我有一个类似的问题,这解决了它。
设置 PYSPARK_PYTHON=python3
和 PYSPARK_DRIVER_PYTHON=python3
都适合我。
我在 .bashrc
中使用导出来完成此操作。最后,这些是我创建的变量:
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/
对我的案例有帮助:
import os
os.environ["SPARK_HOME"] = "/usr/local/Cellar/apache-spark/1.5.1/"
os.environ["PYSPARK_PYTHON"]="/usr/local/bin/python3"
我在 IPython 中 运行 设置了它(如本 link by 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"
}
错误
"Exception: Python in worker has different version 2.6 than that in driver
2.7, PySpark cannot run with different minor versions".
修复(针对 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
我使用的环境如下
? 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"
在notebook中,我设置的环境如下
from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()
如果您只想更改当前任务的 python 版本,您可以使用以下 pyspark 启动命令:
PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..
我遇到了同样的错误信息,我已经尝试了上面提到的三种方法。我将结果列为对其他人的补充参考。
- 更改
PYTHON_SPARK
和 PYTHON_DRIVER_SPARK
中的值 spark-env.sh
对我不起作用。
- 使用
os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5"
更改 python 脚本中的值
os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"
对我不起作用。
- 更改
~/.bashrc
中的值非常有效~
我刚遇到同样的问题,这些是我为提供 Python 版本而遵循的步骤。我想 运行 我的 PySpark 作业使用 Python 2.7 而不是 2.6。
转到 $SPARK_HOME
指向的文件夹(在我的例子中是 /home/cloudera/spark-2.1.0-bin-hadoop2.7/
)
在文件夹 conf
下,有一个名为 spark-env.sh
的文件。 如果您有一个名为 spark-env.sh.template
的文件,您需要将该文件复制到一个名为 spark-env.sh
.
的新文件中
编辑文件并写入接下来的三行
export PYSPARK_PYTHON=/usr/local/bin/python2.7
export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python2.7
export SPARK_YARN_USER_ENV="PYSPARK_PYTHON=/usr/local/bin/python2.7"
保存并再次启动您的应用程序:)
这样,如果你下载一个新的 Spark 独立版本,你可以设置你想要 运行 PySpark 的 Python 版本。
如果您运行在较大的组织中使用 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"
运行今天上班。管理员认为将 Python 2.7 硬编码为 $SPARK_HOME/conf/spark-env.sh
中的 PYSPARK_PYTHON
和 PYSPARK_DRIVER_PYTHON
是明智的。不用说,这破坏了我们所有使用任何其他 python 版本或环境的工作(这是我们工作的 > 90%)。 @PhillipStich 正确地指出,您可能并不总是拥有此文件的写权限,就像我们的情况一样。虽然在 spark-submit
调用中设置配置是一个选项,但另一种选择(当 运行 处于 yarn/cluster 模式时)是将 SPARK_CONF_DIR
环境变量设置为指向另一个配置脚本.在那里你可以设置你的 PYSPARK_PYTHON 和你可能需要的任何其他选项。可以在 spark-env.sh source code on github.
中找到模板
我在 windows 中的 standalone spark 上遇到了同样的问题。
我的修复版本是这样的:
我的环境变量设置如下
PYSPARK_SUBMIT_ARGS="pyspark-shell"
PYSPARK_DRIVER_PYTHON=jupyter
PYSPARK_DRIVER_PYTHON_OPTS='notebook' pyspark
使用此设置,我在 pyspark 上执行了一个操作并得到以下异常:
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。很明显,我的 spark-worker 正在使用系统 python,即 v3.6.3.
现在我通过设置 PYSPARK_DRIVER_PYTHON=jupyter
将我的 spark-driver 设置为 运行 jupyter 所以我需要检查 python 版本的 jupyter正在使用。
要执行此操作,请打开 Anaconda Prompt 并点击
python --version
Python 3.5.X :: Anaconda, Inc.
这里得到了 jupyter python 正在使用 v3.5.x。您也可以在任何笔记本中查看此版本(帮助->关于)。
现在我需要将 jupyter python 更新到版本 v3.6.6。为此,请打开 Anaconda Prompt 并点击
conda search python
这将为您提供 Anaconda 中可用 python 版本的列表。使用
安装你想要的
conda install python=3.6.3
现在我有两个 Python 安装相同版本的 3.6.3 Spark 不应该符合,而当我 运行 对 Spark-driver 的操作时它不符合。异常消失了。
快乐编码...
请看下面的片段:
#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
就我而言 (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
将引用我安装在 site-package
中的 pyspark
包。
要了解如何使用 vim
,请转到 this link。
运行:
ls -l /usr/local/bin/python*
此示例中的第一行显示 python3 符号链接。要将其设置为默认 python 符号链接 运行,请执行以下操作:
ln -s -f /usr/local/bin/python3 /usr/local/bin/python
然后重新加载您的 shell。
我遇到了同样的问题,只是忘了激活我的虚拟环境。
如果您正在处理 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
如果您使用的是另一个 OS,请检查以下内容 link:
https://github.com/GalvanizeDataScience/spark-install
我在使用 pycharm 和 spark 时遇到了同样的问题。
为了修复此错误,我已按照以下步骤进行修复。
单击 pycharm 菜单栏中的 运行 选项。
单击“编辑配置”选项。
点击环境变量并写下下面几行
根据您所在的位置。
PYSPARK_PYTHON=/usr/bin/python3.6;
PYSPARK_DRIVER_PYTHON=/usr/bin/python3.6;
SPARK_HOME=/home/xxxxxx/Desktop/xxxx/spark
我正在使用 spark 1.4.0-rc2,因此我可以将 python 3 与 spark 一起使用。如果我将 export PYSPARK_PYTHON=python3
添加到我的 .bashrc
文件中,我可以 运行 与 python 3 进行交互。但是,如果我想 运行 本地的独立程序模式,我得到一个错误:
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
无效。
您需要确保您启动的独立项目是使用 Python 启动的 3. 如果您通过 spark-submit 提交您的独立程序,那么它应该可以正常工作,但如果您正在启动它使用 python 确保您使用 python3 启动您的应用程序。
此外,请确保您已在 ./conf/spark-env.sh
中设置环境变量(如果不存在,您可以使用 spark-env.sh.template
作为基础。)
您可以通过在 ./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
在这种情况下,它将 workers/executors 使用的 Python 版本设置为 Python3,并将 Python 的驱动程序版本设置为 iPython一个更好的 shell 工作环境。
如果您还没有 spark-env.sh
文件,并且不需要设置任何其他变量,那么这个应该可以满足您的要求,假设相关 python 的路径二进制文件是正确的(用 which
验证)。我有一个类似的问题,这解决了它。
设置 PYSPARK_PYTHON=python3
和 PYSPARK_DRIVER_PYTHON=python3
都适合我。
我在 .bashrc
中使用导出来完成此操作。最后,这些是我创建的变量:
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/
对我的案例有帮助:
import os
os.environ["SPARK_HOME"] = "/usr/local/Cellar/apache-spark/1.5.1/"
os.environ["PYSPARK_PYTHON"]="/usr/local/bin/python3"
我在 IPython 中 运行 设置了它(如本 link by 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"
}
错误
"Exception: Python in worker has different version 2.6 than that in driver 2.7, PySpark cannot run with different minor versions".
修复(针对 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
我使用的环境如下
? 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"
在notebook中,我设置的环境如下
from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()
如果您只想更改当前任务的 python 版本,您可以使用以下 pyspark 启动命令:
PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..
我遇到了同样的错误信息,我已经尝试了上面提到的三种方法。我将结果列为对其他人的补充参考。
- 更改
PYTHON_SPARK
和PYTHON_DRIVER_SPARK
中的值spark-env.sh
对我不起作用。 - 使用
os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5"
更改 python 脚本中的值os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"
对我不起作用。 - 更改
~/.bashrc
中的值非常有效~
我刚遇到同样的问题,这些是我为提供 Python 版本而遵循的步骤。我想 运行 我的 PySpark 作业使用 Python 2.7 而不是 2.6。
转到
$SPARK_HOME
指向的文件夹(在我的例子中是/home/cloudera/spark-2.1.0-bin-hadoop2.7/
)在文件夹
conf
下,有一个名为spark-env.sh
的文件。 如果您有一个名为spark-env.sh.template
的文件,您需要将该文件复制到一个名为spark-env.sh
. 的新文件中
编辑文件并写入接下来的三行
export PYSPARK_PYTHON=/usr/local/bin/python2.7
export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python2.7
export SPARK_YARN_USER_ENV="PYSPARK_PYTHON=/usr/local/bin/python2.7"
保存并再次启动您的应用程序:)
这样,如果你下载一个新的 Spark 独立版本,你可以设置你想要 运行 PySpark 的 Python 版本。
如果您运行在较大的组织中使用 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"
运行今天上班。管理员认为将 Python 2.7 硬编码为 $SPARK_HOME/conf/spark-env.sh
中的 PYSPARK_PYTHON
和 PYSPARK_DRIVER_PYTHON
是明智的。不用说,这破坏了我们所有使用任何其他 python 版本或环境的工作(这是我们工作的 > 90%)。 @PhillipStich 正确地指出,您可能并不总是拥有此文件的写权限,就像我们的情况一样。虽然在 spark-submit
调用中设置配置是一个选项,但另一种选择(当 运行 处于 yarn/cluster 模式时)是将 SPARK_CONF_DIR
环境变量设置为指向另一个配置脚本.在那里你可以设置你的 PYSPARK_PYTHON 和你可能需要的任何其他选项。可以在 spark-env.sh source code on github.
我在 windows 中的 standalone spark 上遇到了同样的问题。 我的修复版本是这样的: 我的环境变量设置如下
PYSPARK_SUBMIT_ARGS="pyspark-shell"
PYSPARK_DRIVER_PYTHON=jupyter
PYSPARK_DRIVER_PYTHON_OPTS='notebook' pyspark
使用此设置,我在 pyspark 上执行了一个操作并得到以下异常:
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。很明显,我的 spark-worker 正在使用系统 python,即 v3.6.3.
现在我通过设置 PYSPARK_DRIVER_PYTHON=jupyter
将我的 spark-driver 设置为 运行 jupyter 所以我需要检查 python 版本的 jupyter正在使用。
要执行此操作,请打开 Anaconda Prompt 并点击
python --version
Python 3.5.X :: Anaconda, Inc.
这里得到了 jupyter python 正在使用 v3.5.x。您也可以在任何笔记本中查看此版本(帮助->关于)。
现在我需要将 jupyter python 更新到版本 v3.6.6。为此,请打开 Anaconda Prompt 并点击
conda search python
这将为您提供 Anaconda 中可用 python 版本的列表。使用
安装你想要的conda install python=3.6.3
现在我有两个 Python 安装相同版本的 3.6.3 Spark 不应该符合,而当我 运行 对 Spark-driver 的操作时它不符合。异常消失了。 快乐编码...
请看下面的片段:
#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
就我而言 (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
将引用我安装在 site-package
中的 pyspark
包。
要了解如何使用 vim
,请转到 this link。
运行:
ls -l /usr/local/bin/python*
此示例中的第一行显示 python3 符号链接。要将其设置为默认 python 符号链接 运行,请执行以下操作:
ln -s -f /usr/local/bin/python3 /usr/local/bin/python
然后重新加载您的 shell。
我遇到了同样的问题,只是忘了激活我的虚拟环境。
如果您正在处理 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
如果您使用的是另一个 OS,请检查以下内容 link: https://github.com/GalvanizeDataScience/spark-install
我在使用 pycharm 和 spark 时遇到了同样的问题。 为了修复此错误,我已按照以下步骤进行修复。
单击 pycharm 菜单栏中的 运行 选项。
单击“编辑配置”选项。
点击环境变量并写下下面几行 根据您所在的位置。
PYSPARK_PYTHON=/usr/bin/python3.6; PYSPARK_DRIVER_PYTHON=/usr/bin/python3.6; SPARK_HOME=/home/xxxxxx/Desktop/xxxx/spark