トラブルシューティング / パッケージを 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して関連リソースをロードする際、このパッケージは2回目のインストール時に正しくインストールされていないため、正常にimportできません - このとき、DataFlux Func を再起動すると、再起動によりキャッシュが解放されるため、上記の状況 1. は上記の状況 2. になります。
4. 解決方法
numpy 1.22.1 を例にすると、インストール後にリソースディレクトリ / extra-python-packagesの配下に以下のフォルダが作成されます:
numpynumpy-1.22.1.dist-infonumpy.libs
リソースディレクトリのホストマシン上のデフォルトの位置は:/usr/local/dataflux-func/data/resources/extra-python-packages
リソースディレクトリのコンテナ内の位置は:/data/resources/extra-python-packages
この問題を解決する操作手順は以下のとおりです:
- 上記の
numpyに関連するフォルダを完全に削除します - DataFlux Func を再起動します
numpyを再インストールします