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