当前位置: 首页 > news >正文

解决Python升级导致PySpark任务异常方案

背景

上一篇文章中写了  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.xzcd 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.7rm -rf python3ln -s python3.7 python3python3 -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 'encodingspython3 -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.16vim ~/.bashrc[root@-centos miniconda3]# cat ~/.bashrc
# .bashrc# User specific aliases and functionsalias 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 验证最小demofrom pyspark.sql import SparkSessionspark = 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

http://www.lryc.cn/news/539736.html

相关文章:

  • Linux中线程创建,线程退出,线程接合
  • 机器视觉检测中,2D面阵相机和线扫相机的区别
  • LeetCode 热题 100_N 皇后 (62_51_困难_C++)(递归(回溯))
  • Winform(C#) 项目保存页面
  • 【LeetCode: LCR 126. 斐波那契数 + 动态规划】
  • OSPF(开放路径最短优先)
  • JAVA EE初阶 - 预备知识(四)
  • 如何解决服务器端口被攻击:全面防护与快速响应
  • golang panic原理
  • scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析
  • 【Elasticsearch】查询规则_query_rules
  • Git备忘录(三)
  • 用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?
  • vite调试node_modules下面插件
  • ES12 weakRefs的用法和使用场景
  • 【Python】集合set详细讲解(语法、操作、集合运算、性能、使用场景)
  • 网络安全大数据架构 网络安全之数据安全
  • (前端基础)CSS(一)
  • Redis数据类型全景解析:从底层编码到应用反模式
  • (蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解
  • TypeScript跟js,es6这些的区别
  • flink-cdc同步数据到doris中
  • Kubernetes:EKS 中 Istio Ingress Gateway 负载均衡器配置及常见问题解析
  • Golang教程
  • AI 百炼成神:线性回归,预测房价
  • 企业软件合规性管理:构建高效、安全的软件资产生态
  • 每日一题——编辑距离
  • TensorFlow项目GPU运行 安装步骤
  • c++进阶———继承
  • FreeSwitch的mod_translate模块详细,附带场景案例及代码示例