跳轉到

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