故障排查 / 包无法 import 或版本错误
1. 前言
在正常的 Python 开发中,任何第三方包的改动,都需要重新启动系统。
但在 DataFlux Func 中,为了开发的便捷性,安装第三方包并不需要重启整个 DataFlux Func 系统。
但这并不能保证 100% 稳妥。
在 DataFlux Func 不重启的情况下,能够正常安装、升级的第三方包,需要满足以下条件:
- 纯 Python 编写的包(如不包含 C 扩展)
- 没有预加载内容(如各类大数据模型)
当某个第三方包不满足上述条件时,只能保证首次安装时能够正常使用,后续更新都需要重启整个 DataFlux Func
2. 故障案例 numpy
常用的 numpy 包就是一个典型的使用了 C 扩展的包,在部署 DataFlux Func 后首次安装 numpy 可以正常使用,但如果后续再次安装不同版本的 numpy。
那么,你可能会遇到以下几种故障:
2.1 numpy 无法 import
以 numpy 为例,在脚本执行到 import numpy
时抛出了如下错误:
Text Only | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
2.2 numpy 可以使用但调用的是旧版本
以 numpy 为例,通过打印包对象的__version___
可以看到实际代码执行过程中,numpy 包的版本,但与实际安装的不一致。
Python | |
---|---|
1 |
|
满足此情况并不代表代码还能正常运行,单纯重启 DataFlux Func 后,又会变为上述 1.1 中的问题,切勿忽视
3. 原因解释
类似 numpy 等第三方包,在安装过程中,可能存在下载额外资源(如需要编译的其他语言的代码,数据模型等)的情况。在首次安装后,Python 可以正常读取此第三方包并加载外部数据。
但是,当再次安装同一个包的不同版本时,之前版本中的资源文件仍然在被使用中,实际无法更新 / 覆盖,导致并未正确安装。
此时,对于 DataFlux Func 来说存在如下几种情形:
- 如果一个 Worker 进程已经在之前 import 过这个第三方包,那么这个 Worker 进程可能依靠缓存中的数据依然可以运行,但表现为调用的是旧版本(及首次缓存的版本)
- 如果一个 Worker 进程在之前从未 import 过这个第三方包,那么在首次 import 并加载相关资源时,由于这个包在第二次安装时并未正确安装,因此无法正常 import
- 此时,如果重启 DataFlux Func,那么上述情形 1. 会因为重启释放了缓存,转而变为上述情形 2.
4. 解决方法
以 numpy 1.22.1 为例,安装后会在资源目录 / extra-python-packages
下产生如下文件夹:
numpy
numpy-1.22.1.dist-info
numpy.libs
资源目录的宿主机默认位置为:/usr/local/dataflux-func/data/resources/extra-python-packages
资源目录的容器内位置为:/data/resources/extra-python-packages
解决此问题的操作步骤如下:
- 彻底删除上述与 numpy 有关的文件夹
- 重启 DataFlux Func
- 重新安装 numpy