如何为CDH 5.8.3集群配置Python 3.5+运行环境?
我之前维护CDH 5.x集群的时候也碰到过这个难题——Cloudera官方提供的Parcel确实只支持Python 2.7,要用上Python 3.5+得自己想办法。下面是几个我亲测有效的方案,你可以根据集群规模和需求选:
方案一:手动在所有节点安装Python3并配置CDH环境变量
这个方案适合集群节点不多的情况,操作直接:
- 节点安装Python3:在每个集群节点上安装Python3.5+,注意绝对不要覆盖系统默认的Python2.7(很多CDH组件依赖它)
- CentOS系统可以用yum:
sudo yum install python36 python36-devel - 要是需要特定版本,也可以源码编译:下载对应版本源码后,执行
./configure --prefix=/usr/local/python3 --enable-shared,再make && make install,最后记得配置LD_LIBRARY_PATH=/usr/local/python3/lib避免动态库找不到
- CentOS系统可以用yum:
- 配置CDH组件使用Python3:
- 登录Cloudera Manager Web UI,找到需要Python3的服务(比如Spark、Hue、Oozie)
- 针对Spark:在Spark服务的配置里,找到
spark.executorEnv.PYSPARK_PYTHON、spark.yarn.appMasterEnv.PYSPARK_PYTHON,设置为你的Python3路径(比如/usr/bin/python3);同时配置spark.pyspark.python和spark.pyspark.driver.python - 针对Hue:修改Hue的配置项,比如在
hue_server_args里添加Python3路径,或者给Hue单独配置Python3虚拟环境(不过CDH5.8的Hue对Python3适配有限,建议先在测试环境验证)
- 验证配置:提交一个简单的PySpark任务,比如
pyspark --version,看输出里的Python版本;或者在Hue里运行一段Python3代码测试
方案二:自定义Python3 Parcel
如果集群节点多,手动安装太麻烦,可以自己做一个Python3的Parcel,通过Cloudera Manager统一分发:
- 准备Python3二进制包:确保包是静态编译或者包含所有依赖的,避免节点缺少依赖库
- 按照Parcel规范打包:
- 编写
parcel.json,定义Parcel的版本、兼容的CDH版本(比如cdh5)、安装路径等 - 在
meta目录下创建env.sh,配置Python3的环境变量(比如export PATH=/opt/cloudera/parcels/PYTHON3/bin:$PATH) - 把Python3的文件放到
packages目录下,然后打包成.parcel文件和对应的.sha校验文件
- 编写
- 分发激活Parcel:把制作好的Parcel放到Cloudera Manager的Parcel仓库,然后在Web UI里分配、激活这个Parcel
- 配置组件路径:和方案一的第二步一样,让CDH服务指向这个Parcel里的Python3路径
- 注意:制作Parcel需要熟悉Cloudera的Parcel规范,官方有详细的开发文档可以参考
方案三:使用Conda虚拟环境(适合特定任务场景)
如果只是部分任务需要Python3,不想全局修改集群配置,可以用Conda虚拟环境隔离:
- 安装Miniconda/Anaconda:在所有节点安装Miniconda(比Anaconda轻量),同样不要影响系统默认Python2.7
- 创建Python3虚拟环境:执行
conda create -n py3env python=3.6,确保所有节点的虚拟环境路径一致 - 任务中指定虚拟环境:
- 提交PySpark任务时,通过参数指定:
spark-submit --conf spark.executorEnv.PYSPARK_PYTHON=/path/to/py3env/bin/python your_script.py - Oozie工作流里,可以在执行脚本前先激活虚拟环境:
source /path/to/py3env/bin/activate && python your_script.py
- 提交PySpark任务时,通过参数指定:
- 如果节点多,也可以把虚拟环境打包放到HDFS上,任务执行时从HDFS解压使用
重要注意事项
- 绝对不要替换系统默认Python2.7:CDH的Cloudera Agent、Hadoop脚本等大量组件依赖Python2.7,替换会直接导致集群崩溃
- 先在测试环境验证:任何配置变更前,先在单个节点或者测试集群测试,确认没问题再推到生产环境
- 注意组件兼容性:CDH5.8.3的Spark版本如果是1.6,对Python3的支持有限;如果是Spark2.1+,兼容性会更好,需要提前确认你的Spark版本
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

