2017-09-07 8 views
0

問題:私のローカルマシンからspark-submitスクリプトをマシンのクラスタに実行しようとしています。クラスタによって行われる作業はnumpyを使用します。私はセットアップにnumpyのと同様に、私は私のプロジェクトや他のさまざまなライブラリで使用するプライベートレポが含まvirtualenvのを持っている私のローカル環境では :pysparkジョブでvirtualenvを配送して使用する

ImportError: 
Importing the multiarray numpy extension module failed. Most 
likely you are trying to import a failed build of numpy. 
If you're working with a numpy git repo, try `git clean -xdf` (removes all 
files not under version control). Otherwise reinstall numpy. 

Original error was: cannot import name multiarray 

詳細:私は現在、次のエラーを取得します。私はzipファイル(lib/libs.zip)をvenv/lib/site-packagesのsite-packagesディレクトリから作成しました。ここで、 'venv'は私の仮想環境です。このzipをリモートノードに発送します。このように火花提出ルックスを実施するための私のシェルスクリプト:

$SPARK_HOME/bin/spark-submit \ 
    --deploy-mode cluster \ 
    --master yarn \ 
    --conf spark.pyspark.virtualenv.enabled=true \ 
    --conf spark.pyspark.virtualenv.type=native \ 
    --conf spark.pyspark.virtualenv.requirements=${parent}/requirements.txt \ 
    --conf spark.pyspark.virtualenv.bin.path=${parent}/venv \ 
    --py-files "${parent}/lib/libs.zip" \ 
    --num-executors 1 \ 
    --executor-cores 2 \ 
    --executor-memory 2G \ 
    --driver-memory 2G \ 
    $parent/src/features/pi.py 

は、私はまた、リモート・ノード上のpython 2.7がインストール含み/usr/local/bin/python2.7フォルダがあることを知っています。

のでspark-env.sh私のconf /に私は次のように設定しています

export PYSPARK_PYTHON=/usr/local/bin/python2.7 
export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python2.7 

私はスクリプトを実行すると、私は上記のエラーを取得します。私がinstalled_distributionsをスクリーン印刷すると、長さがゼロのリスト[]が得られます。私の個人的な図書館も正しく輸入されています(私には実際に私のlibs.zipサイトパッケージにアクセスしています)。マイpi.pyファイルには、次のようになります。

from myprivatelibrary.bigData.spark import spark_context 
spark = spark_context() 
import numpy as np 
spark.parallelize(range(1, 10)).map(lambda x: np.__version__).collect() 

期待/ MY THOUGHTSを: 私はnumpyのは、私の地元のvirtualenvの中で正しく動作します知っているので、これは正しく、特にnumpyのインポートすることを期待しています。リモートノードのvirtualenvにインストールされているPythonのバージョンを実際に使用していないためです。私の質問はまず、これを修正するにはどうすればよいのですか?2番目の方法は、手動でインストールされ、現在そのマシンに座っているpythonの代わりに、リモートノードにvirtualenvをインストールしたpythonを使用する方法ですか?私はこれについていくつかの執筆を見てきましたが、率直に言って、よく書かれていません。

答えて

2

--conf spark.pyspark.{}export PYSPARK_PYTHON=/usr/local/bin/python2.7を使用すると、ローカル環境/ドライバのオプションを設定できます。クラスター(執行)のオプションを設定するには、次の構文を使用します。さらに

--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON 

を、私はあなたが作る必要がありますね、あなたのvirtualenv relocatable(これはしかし、実験的です)。 <edit 20170908>これは、virtualenvが絶対リンクの代わりに相対リンクを使用することを意味します。 </edit>

このような場合は、hdfsでアナウンスディストリビューション全体を出荷しました。

<edit 20170908>

我々は(下のコメントで述べたようにLinuxの対MacOSの)異なる環境について話している場合は、あなただけ(あなたのvirtualenvのは、バイナリでパッケージを含む少なくともいない場合は、virtualenvのを提出することはできませんnumpyの場合のように)。その場合は、自分自身で「ポータブル」なanacondaを作成することをお勧めします。つまり、Linux VMにAnacondaをインストールして圧縮してください。 --archives--py-filesについて

  • --py-filesはPythonのパスにPythonのファイル/パッケージを追加します。spark-submit documentationから:

    For Python applications, simply pass a .py file in the place of instead of a JAR, and add Python .zip, .egg or .py files to the search path with --py-files.

  • --archivesこれらは各エグゼキュータ(のみ糸クラスター)の作業ディレクトリに抽出されることを意味します。

しかし、私の意見では、明確な区別はありません。例えば、this SO postを参照してください。

--archivesで、「その他のpythonファイル」を--py-filesで追加してください。 Running Pyspark with Virtualenv、ヘニングKroppによってブログ記事:</edit>

も参照してください。

+0

ありがとうございました。私にとって2つの課題が最初にあります。リロケータブルな仮想マシンは、基本的に同じ/類似の仕様のマシン上で生成する必要があります。第2に、エグゼキュータとの間で複数のテンティング状況に陥っているため、非仮想的なアプローチが私の隔離を破壊してしまいます。おそらく、私はターゲットのエグゼキュータスペックに等しいVMに私のレポを入れて、次にvenvをビルドする必要がありますか?また、ブログの投稿では、--py-filesの代わりにアーカイブフラグを使用しています。古いバージョンであるかどうか疑問です。 –

+0

上記の編集を参照してください... –

関連する問題