跳轉至

故障排查 / 包無法 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