解决Python升级导致PySpark任务异常方案
- 其他
- 2025-08-27 01:09:01

背景
上一篇文章中写了 Linux 多Python版本统一和 PySpark 依赖 python 包方案,但是最近升级 Linux 服务器 上 Python 版本(3.6.8 -> 3.7.16,手动编译Python官方的二进制源码)之后,发现之前文章提到 python3 -m venv /path 方式打包 python.zip 包后,之前 pyspark 任务运行出现 Fatal Python error: initfsencoding: Unable to get the locale encoding。ModuleNotFoundError: No module named 'encodings 异常,导致任务失败。尝试多次编译Python源码和尝试网上提供的解决方案,发现还是不行。
后续发现可以通过 conda 虚拟环境打包方案,可以解决上面出现的问题。
解决方案 # 官方下载 Python 版本,并手动编译 tar -xvf Python-3.7.16.tar.xz cd Python-3.7.16 ./configure --prefix=/usr/local/python3.7.16 --enable-shared --with-ssl && make && make install # linux 服务器 Python 版本软连接变更(根据自己连接调整) cd /usr/bin # 软连接如果存在,则删除 ln -s /usr/local/python3.7.16/bin/python3.7 python3.7 rm -rf python3 ln -s python3.7 python3 python3 -V #根据需要创建通用软连接 ln -s /usr/local/python3.7.16 /usr/local/python3 #依赖的 python3.zip 下面这个方法打包有问题,encodings 包有缺失问题。所以 下面采用 conda 虚拟环境打包 #Pyspark 任务运行出现类似这样异常 Fatal Python error: initfsencoding: Unable to get the locale encoding。ModuleNotFoundError: No module named 'encodings python3 -m venv /home/root/python3.7.16-venv/ #通过 conda 来打包 python3.zip,解决之前方法打包遗漏问题,官方下载安装 Miniconda3软件包 # 添加执行权限 chmod +x Miniconda3-latest-Linux-x86_64.sh #安装 ./Miniconda3-latest-Linux-x86_64.sh # 使环境变量生效,后续不用再注释掉 ~/.bashrc 中新增的 conda 配置 source ~/.bashrc # 激活环境 source activate py37_env # 退出环境 conda deactivate # 查看环境位置 conda env list # 进入环境目录(通常在) cd /root/miniconda3/envs/py37_env # 创建打包目录 mkdir -p ~/python37_pack cd ~/python37_pack # 复制必要文件 cp -r ../lib . cp -r ../bin . # 打包 zip -r python37.zip * mv /usr/local/python3/python3.zip /usr/local/python3/python3.zip.bak.$(date +%Y-%m-%d) cp python37.zip /usr/local/python3/ # 注释 conda 环境变量,conda 默认环境Python版本比较高 echo $PATH #如果linux 服务器上安装的Python版本跟 conda 自身Python 版本不一致,注释掉 类似以下的 Conda 相关配置即可 [root@-centos miniconda3]# pwd /root/miniconda3 [root@-centos miniconda3]# ./bin/python3 -V Python 3.12.9 [root@-centos miniconda3]# python3 -V Python 3.7.16 vim ~/.bashrc [root@-centos miniconda3]# cat ~/.bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! #__conda_setup="$('/root/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" #if [ $? -eq 0 ]; then # eval "$__conda_setup" #else # if [ -f "/root/miniconda3/etc/profile.d/conda.sh" ]; then # . "/root/miniconda3/etc/profile.d/conda.sh" # else # export PATH="/root/miniconda3/bin:$PATH" # fi #fi #unset __conda_setup # <<< conda initialize <<< source ~/.bashrc # PySpark 验证最小demo from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() rdd = spark.sparkContext.parallelize([1, 2, 3]) print(rdd.map(lambda x: x * 2).collect()) spark.stop() #手动提交命令 client 或 cluster 都行 spark-submit --master yarn --deploy-mode cluster --archives file:///usr/local/python3/python3.zip#python3 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./python3/bin/python3 /xxx/test.py解决Python升级导致PySpark任务异常方案由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“解决Python升级导致PySpark任务异常方案”
下一篇
如何安装Hadoop