如何在Cloudera QuickStart VM 5.8中让PySpark使用Python3.6?
解决Spark 1.6.0 + Python 3.6的PySpark启动报错问题
这个报错的核心原因是Spark 1.6.0自带的py4j版本(0.9)太老旧,和Python 3.6的标准库不兼容——Python 3.6对collections.namedtuple的调用要求新增了verbose、rename、module这几个关键字参数,但Spark 1.6的pyspark/serializers.py里的封装逻辑没跟上这个变化,导致调用时参数缺失。
下面是具体的解决步骤:
解决方案步骤
1. 替换Spark自带的旧py4j包
Spark 1.6默认的py4j版本无法适配Python3.6,我们需要换成兼容的版本(比如py4j-0.10.7,这个版本既适配Python3.6,又能和Spark1.6正常协作):
- 定位Spark的Python库目录:
/usr/lib/spark/python/lib/ - 删除旧的py4j压缩包:
sudo rm /usr/lib/spark/python/lib/py4j-0.9-src.zip - 下载兼容的py4j版本到目标目录:
sudo wget -P /usr/lib/spark/python/lib/ https://repo1.maven.org/maven2/net/sourceforge/py4j/py4j/0.10.7/py4j-0.10.7.zip提示:如果wget无法使用,也可以先下载到本地再传到VM,或者用curl替代执行下载。
2. 配置永久生效的PYSPARK_PYTHON环境变量
为了避免每次启动都手动执行export命令,我们把配置写入用户的bash配置文件:
- 编辑
~/.bashrc文件:vi ~/.bashrc - 在文件末尾添加一行:
export PYSPARK_PYTHON=python3.6 - 让配置立即生效:
source ~/.bashrc
3. 验证PySpark启动
现在直接运行pyspark命令,应该能正常进入Python3.6的PySpark Shell,且SparkContext(sc)会自动初始化:
pyspark
正常情况下会看到类似如下的输出,且不会再出现之前的TypeError:
Python 3.6.3 (default, Dec 31 2017, 07:08:36) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux Type "help", "copyright", "credits" or "license" for more information. Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /__ / .__/\_,_/_/ /_/\_\ version 1.6.0 /_/ Using Python version 3.6.3 (default, Dec 31 2017 07:08:36) SparkContext available as sc, HiveContext available as sqlContext. >>>
额外注意事项
- 绝对不要修改系统默认的Python2.6.6,CentOS系统确实依赖它运行核心组件,我们只是让PySpark单独使用Python3.6,完全不影响系统全局环境。
- 如果替换py4j-0.10.7后仍有问题,可以尝试py4j-0.10.4到0.10.9之间的版本,这些版本都和Python3.6兼容。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

