コンテンツにスキップ

トラブルシューティング / パッケージを 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 して関連リソースをロードする際、このパッケージは2回目のインストール時に正しくインストールされていないため、正常に 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 を再インストールします