Linux 多Python版本统一和 PySpark 依赖 python 包方案
背景
Linux 服务器经常有多个Python版本,比如 Python2 有两个版本,Python3 有两个版本。在使用上容易混淆,而且有些需要新增一些 module 更容易,安装如果路径不统一,导致日常使用时,会出现找不到新安装module的问题。
所以目前简单的方案,统一Linux上使用的Python版本。
解决方案
Python 路径
Linux服务器一般可能存在多版本(这里以 Python3 为例,Python2 不建议业务继续使用),一个在 /usr/local/python3 目录下,版本是 3.6.15; 另一个在 /usr/bin/python3 目录下,版本是 3.6.8。
多版本Python容易混淆,而且安装依赖不太方便,后续统一Python使用 系统环境 /usr/bin/python3 ,版本是 3.6.8。
同时 /usr/local/python3/bin/python3 不在使用,先备份这个路径下 /usr/local/python3/bin/python3 版本,然后做一个新的软连接,统一使用系统环境中 python3 版,如下图所示:
mv /usr/local/python3/bin/python3 /usr/local/python3/bin/python3_bak
ln -s /bin/python3 /usr/local/python3/bin/python3
[root@centos ~]# which python3
/usr/bin/python3
[root@centos ~]# cd /usr/local/python3/bin/
[root@centos bin]# ll
total 37312
-rwxr-xr-x 1 root root 111 Jan 1 2022 2to3
-rwxr-xr-x 1 root root 111 Jan 1 2022 2to3-3.6
-rwxr-xr-x 1 root root 252 Jan 1 2022 easy_install-3.6
-rwxr-xr-x 1 root root 109 Jan 1 2022 idle3
-rwxr-xr-x 1 root root 109 Jan 1 2022 idle3.6
-rwxr-xr-x 1 root root 262 Apr 27 2023 normalizer
-rwxr-xr-x 1 root root 243 Mar 30 2023 pip
-rwxr-xr-x 1 root root 243 Mar 30 2023 pip3
-rwxr-xr-x 1 root root 243 Mar 30 2023 pip3.6
-rwxr-xr-x 1 root root 94 Jan 1 2022 pydoc3
-rwxr-xr-x 1 root root 94 Jan 1 2022 pydoc3.6
lrwxrwxrwx 1 root root 12 Mar 30 2023 python3 -> /bin/python3
-rwxr-xr-x 1 root root 12710424 Jan 1 2022 python3.6
-rwxr-xr-x 1 root root 3107 Jan 1 2022 python3.6-config
-rwxr-xr-x 1 root root 12710424 Jan 1 2022 python3.6m
-rwxr-xr-x 1 root root 3107 Jan 1 2022 python3.6m-config
-rwxr-xr-x 1 root root 12710424 Jan 1 2022 python3_bak
-rwxr-xr-x 1 root root 3107 Jan 1 2022 python3-config
-rwxr-xr-x 1 root root 451 Jan 1 2022 pyvenv
-rwxr-xr-x 1 root root 451 Jan 1 2022 pyvenv-3.6
[root@centos bin]# ./python3.6 -V
Python 3.6.15
[root@centos bin]#
[root@centos bin]# python3 -V
Python 3.6.8
Python Module
业务在使用上,可以需要安装一下Python依赖的module,经过上面的版本统一,所以这样就可以直接使用 pip3 install xxx 即可。
对于 Python Spark 类型的任务,在执行的时候,尽量选择 deploy-mode client 模式。这样会任务会依赖本地的 python3 包。
对于使用 deploy-mode cluster,会依赖 /usr/local/python3/python3.zip 这个包,如果业务任务需要依赖新安装的 module ,此时需要重新打包 python3.zip 包。
[root@centos python3]# pwd
/usr/local/python3
[root@centos python3]# ll
total 2032912
drwxr-xr-x 2 root root 4096 Apr 27 2023 bin
drwxr-xr-x 3 root root 4096 Jan 1 2022 include
drwxr-xr-x 4 root root 4096 Jan 1 2022 lib
-rwxrwxrwx 1 root root 687685756 Jan 15 10:29 python3.zip
drwxr-xr-x 3 root root 4096 Jan 1 2022 share
drwxr-xr-x 6 root root 4096 Apr 27 2023 test
按照上述的使用系统环境变量中版本,这个python包很难去获得。目前只能通过按照到 /usr/local/python3/bin/pip3 install xxx 模式,安装在指定路径下,然后执行 cd /usr/local/python3/ && zip -r python3.zip * 包。
Python Module 虚拟环境打包
PySpark类型的任务默认使用 yarn cluster 模式提交的,所以需要将提交机器上 python3.zip 包上传到 远程的 driver和 executor 上,针对一些新安装的python3模块,需要将安装的模块重新打包到 python3.zip 中。
否则,任务执行会出现找不到 python3 中某个模块。
在Linux Centos上创建一个python3虚拟环境 venv,启动python3虚拟环境,在虚拟环境中安装需要的module即可,具体的详细命令如下,后续会整理成一个自动化脚本:
PS:1.如果有自定义开发的module,需要手动安装一下 ;
2.下面的Python3的虚拟环境可以复用,不用重复创建。
###注意:下面的Python3的虚拟环境可以复用,不用重复创建
#创建python3虚拟环境路径,使用系统环境变量中python3版本
python3 -m venv /home/root/python3-venv/
#进入python3虚拟环境目录
cd /home/root/python3-venv/
#获取当前系统环境下python3安装的module
pip3 freeze > requirements.txt
#启动虚拟python3环境
source /home/root/python3-venv/bin/activate
#将系统环境中安装的python3模块安装到虚拟python3环境
pip3 install -r requirements.txt
#退出python3虚拟环境
deactivate
#python3打包
zip -r python3.zip *
mv /usr/local/python3/python3.zip /usr/local/python3/python3.zip.bak.$(date +%Y-%m-%d)
cp /home/root/python3-venv/python3.zip /usr/local/python3/
chmod 777 /usr/local/python3/python3.zip
问题总结
#如果报错:[rootaV-centos]# python3 -m veny/home/root/python3-venv /home/root/python3-venv/bin/python3'ensurepip','--upgrade" rror: Command'--default-pip']' returned non-zero exit status 1
#如果上面创建python3虚拟环境命令有问题,可以试试下面这个命令,不复制 pip3,后续通过手动方式安装pip3
python3 -m venv --without-pip /home/root/python3-venv/
cd /home/root/python3-venv/
#启动虚拟python3环境
source /home/root/python3-venv/bin/activate
#下载 3.6 pip3 安装文件
wget https://bootstrap.pypa.io/pip/3.6/get-pip.py
#安装pip3
sudo python3 get-pip.py
#查看pip3使用的路径
which pip3
#退出python3虚拟环境
deactivate
SO文件问题
调度机上面对应的需要的SO文件,放到 Python3 site-packages 路径下,再打包就好了。
有些so文件,可以放的位置不太一样。比如 librocketmq.so 文件,存放的位置是 /usr/lib/python3.6/site-packages/rocketmq 路径下。
cp /usr/lib64/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3.6/site-packages
MQ 安装和参考
报错:ImportError: rocketmq dynamic library not found解决方法-CSDN博客