python module をビルドし、pysparkアプリケーションにインポートしたい。
私のパッケージのディレクトリ構造は次のとおりです。
wesam/
|-- data.py
`-- __init__.py
シンプルな import wesam
pysparkスクリプトの上部にあるImportError: No module named wesam
。また、zipで圧縮して、コードに--py-files
as この回答で推奨 、運はありません。
./bin/spark-submit --py-files wesam.Zip mycode.py
また、 this answer で示唆されているようにプログラムでファイルを追加しましたが、同じImportError: No module named wesam
エラー。
.sc.addPyFile("wesam.Zip")
ここで何が欠けていますか?
クライアントモード でアプリケーションを送信するため、_spark-submit
_コマンドを実行するマシンがドライバープログラムを実行し、モジュールファイルにアクセスする必要があることが判明しました。
_.bashrc
_ファイルに次の行を追加して、ジョブを送信するノードのPYTHONPATH
環境変数にモジュールを追加しました(または、ジョブを送信する前に実行します)。
_export PYTHONPATH=$PYTHONPATH:/home/welshamy/modules
_
そしてそれは問題を解決しました。パスはドライバーノード上にあるため、_--py-files
_を使用してモジュールを圧縮して出荷したり、sc.addPyFile()
を使用したりする必要はありません。
Pysparkモジュールのインポートエラーの問題を解決する鍵は、ドライバーまたはワーカー(または両方)のノードがモジュールファイルを必要とするかどうかを理解することです。
重要ワーカーノードがモジュールファイルを必要とする場合、_--py-files
_とこの引数must.pyファイルの引数の前。たとえば、これらの例の引数の順序に注意してください。
これは正しいです:
_./bin/spark-submit --py-files wesam.Zip mycode.py
_
これはnot正しい:
_./bin/spark-submit mycode.py --py-files wesam.Zip
_
mycode.pyとwesam.pyを同じパスの場所に入れて試してください
sc.addPyFile("wesam.py")
うまくいくかもしれません。