Dataphin 中使用 Python 计算任务时,经常会遇到想要使用的 module 未被系统内置。那为什么 Dataphin 不能随时增加内置 module,也不在新版本中添加更多 module 呢?
问: Datpahin 目前内置了哪些 module,都是什么版本?
答: 各个版本的内置 module 清单可能会有差异,可以在 shell 任务中执行 “pip list” (Python 2.7) 或 “pip3 list” (Python 3.7)来查看内置的 module 清单。
问: Dataphin 每个新版本为啥不能定期将用户所需要的 module 额外内置进去?
答: Dataphin 的用户比较多,各家所需要的 module 不一样,module 版本也有差异。如果全部都内置,安装包会膨胀得很大,升级部署的时间会变长。
问: Dataphin 为啥不能由用户自行管理内置 module,让用户随时可以添加新的 module?
答: Dataphin 是容器化部署,通过镜像文件分发安装部署文件,镜像生成后无法在用户侧修改。Python 的执行环境在镜像中已经固定不可修改,每次运行 Python 脚本,是从镜像“克隆”出的一个可运行的“实例”。在这个“实例”里面,可以安装新的 module,但是运行结束后,“实例”整个会被销毁。所有对“实例”环境本身的“变更”,如安装 Python module,都随之销毁了。
Python 三方包管理
Dataphin 在 v3.14 版本上线了 Python 三方包管理功能,提供了以下能力:
- 在线安装 Python 三方包(v4.0+),支持输入 module 的名称,系统自动连接镜像源安装指定 module 在所选 Python 版本下的最新版本。支持配置企业自有的镜像源。使用在线安装的前提是,Dataphin 可以连接到镜像源。连接内置镜像源,需要能连接访问公网。
- 上传安装,如果无法使用在线安装或安装过程需要有其他操作,可以使用此种方式。具体使用方式可查看产品文档或根据页面提示说明。
Dataphin 的“Python 三方包”管理功能中的安装实际上是“预安装”,作用是下载安装资源(在线安装)或校验安装资源是否满足安装条件(上传安装)。预安装会在一个虚拟环境真实执行一遍安装动作,成功安装后,整个虚拟环境就被销毁了。当任务需要使用三方包时,需要在任务上显式引入已安装(已预安装)的 module,每次执行 Python 脚本时,系统都会自动在本次的“实例”中重新安装 module ,执行结束后,“实例”就被销毁了。任务显式引入 module 的方式如下:
- 新建 Python 或 shell 任务对话框,“Python 三方包”下拉多选所需 module
- 编辑 Python 或 shell 任务,在“属性-Python 三方包”中设置 module
Python 三方包管理进阶使用
有一些 Python module 除了 Python 资源外,还依赖操作系统的一些 lib。安装这类 module,可能会遇到 module 安装成功,但是无法正常使用,错误信息告知所依赖外部 lib/程序不存在或版本不满足。下面通过一个示例来说明。
Dataphin 内置的 pyodps 的版本是 0.8.0,有的用户可能需要使用更高版本的 pyodps,比如 0.11.6 。在“Python 三方包”中安装 pyodps-0.11.6 (在线安装或上传*.whl 均可)后,实验执行见下图
可以看到:
- pyodps-0.11.6 安装成功
- from dataphin import odps 时报错了,提示当前版本依赖 OpenSSL 1.1.1+,而系统当前 OpenSSL 的版本是 1.0.2k。OpenSSL 是操作系统的一个程序,通过 SSL/TLS 方式连接外部服务时,需要调用该程序。
升级 pyodps 到 0.11.6,除了 pyodps 本身外,还需要升级操作系统下的 OpenSSL。下文是步骤说明:
- 在本地新建目录(文件夹) openssl
- 下载 openssl-1.1.1,下载地址为: https://www.openssl.org/source/old/1.1.1/openssl-1.1.1k.tar.gz,保存到 openssl 目录下
- 在 openssl 目录下新建 shell 脚本 setup.sh, 代码内容如下
# setup.sh # 执行安装 tar -zxvf openssl-1.1.1k.tar.gz cd openssl-1.1.1k/ ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib make make install mv /usr/bin/openssl /usr/bin/openssl.bak ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl # 设置环境 echo "/usr/local/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl.conf ldconfig export PATH=/usr/local/openssl/bin:$PATH
- openssl 目录下的文件内容如下
- 选中 openssl-1.1.1k.tar.gz 和 setup.sh,打包为 openssl.zip,注意: setup.sh 必须在 openssl.zip 的根目录下。
- 在 “Python 三方包”管理中,“安装 Python Module”,选择“上传安装-自定义安装包”,上传 openssl.zip, 点击“确定”后开始预安装。
- 预安装成功后,在任务中增加 openssl 的引用,重新执行后见下图
写在最后
Python 三方包管理一开始的设计目标只是帮助用户更方便引入 Python module (在线安装或上传 *.whl 安装),发现某些 module 同时还需要对安装或升级操作系统的某些程序后,才增加了“上传自定义安装包”方式安装。聪明的你应该意识到,这种方式也可以用于在 shell 任务中安装一些 shell 任务所需要的系统程序。这个功能已经不完全是“Python 三方包”管理了,而是“三方程序”管理。