跳转至

故障排查 / 包无法 import 或版本错误

1. 前言

在正常的 Python 开发中,任何第三方包的改动,都需要重新启动系统。

但在 DataFlux Func 中,为了开发的便捷性,安装第三方包并不需要重启整个 DataFlux Func 系统。

但这并不能保证 100% 稳妥。

在 DataFlux Func 不重启的情况下,能够正常安装、升级的第三方包,需要满足以下条件:

  1. 纯 Python 编写的包(如不包含 C 扩展)
  2. 没有预加载内容(如各类大数据模型)

当某个第三方包不满足上述条件时,只能保证首次安装时能够正常使用,后续更新都需要重启整个 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
#1 --------------------
执行函数: demo__demo.test_numpy()

错误堆栈:
Traceback (most recent call last):
  File "demo__demo", line 1, in <module>
    import numpy
ImportError:
IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!
Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.
We have compiled some common reasons and troubleshooting tips at:
    https://numpy.org/devdocs/user/troubleshooting-importerror.html
Please note and check the following:
  * The Python version is: Python3.8 from "/opt/python/bin/python3.8"
  * The NumPy version is: "1.22.1"
and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.
Original error was: libopenblas64_p-r0-2f7c42d4.3.18.so: cannot open shared object file: No such file or directory

2.2 numpy 可以使用但调用的是旧版本

以 numpy 为例,通过打印包对象的__version___可以看到实际代码执行过程中,numpy 包的版本,但与实际安装的不一致。

Python
1
print(numpy.__version__)

满足此情况并不代表代码还能正常运行,单纯重启 DataFlux Func 后,又会变为上述 1.1 中的问题,切勿忽视

3. 原因解释

类似 numpy 等第三方包,在安装过程中,可能存在下载额外资源(如需要编译的其他语言的代码,数据模型等)的情况。在首次安装后,Python 可以正常读取此第三方包并加载外部数据。

但是,当再次安装同一个包的不同版本时,之前版本中的资源文件仍然在被使用中,实际无法更新 / 覆盖,导致并未正确安装

此时,对于 DataFlux Func 来说存在如下几种情形:

  1. 如果一个 Worker 进程已经在之前 import 过这个第三方包,那么这个 Worker 进程可能依靠缓存中的数据依然可以运行,但表现为调用的是旧版本(及首次缓存的版本)
  2. 如果一个 Worker 进程在之前从未 import 过这个第三方包,那么在首次 import 并加载相关资源时,由于这个包在第二次安装时并未正确安装,因此无法正常 import
  3. 此时,如果重启 DataFlux Func,那么上述情形 1. 会因为重启释放了缓存,转而变为上述情形 2.

4. 解决方法

以 numpy 1.22.1 为例,安装后会在资源目录 / extra-python-packages下产生如下文件夹:

  1. numpy
  2. numpy-1.22.1.dist-info
  3. numpy.libs

资源目录的宿主机默认位置为:/usr/local/dataflux-func/data/resources/extra-python-packages

资源目录的容器内位置为:/data/resources/extra-python-packages

解决此问题的操作步骤如下:

  1. 彻底删除上述与 numpy 有关的文件夹
  2. 重启 DataFlux Func
  3. 重新安装 numpy