2015-12-19 7 views
6

私は大きなクラスター(管理権限がない)でSparkプログラムを実行しています。 numpyがワーカーノードにインストールされていません。したがって、私は私のプログラムでnumpyをバンドルしたが、私は次のエラーを取得する:ナンシーでスタティックなリンク

Traceback (most recent call last): 
    File "/home/user/spark-script.py", line 12, in <module> 
    import numpy 
    File "/usr/local/lib/python2.7/dist-packages/numpy/__init__.py", line 170, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 8, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/numpy/lib/type_check.py", line 11, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/numpy/core/__init__.py", line 6, in <module> 
ImportError: cannot import name multiarray 

スクリプトは実際には非常に簡単です:

from pyspark import SparkConf, SparkContext 
sc = SparkContext() 

sc.addPyFile('numpy.zip') 

import numpy 

a = sc.parallelize(numpy.array([12, 23, 34, 45, 56, 67, 78, 89, 90])) 
print a.collect() 

numpyが動的multiarray.so依存関係をロードするので、私はエラーが発生したことを理解し、 numpy.zipファイルにmultiarray.soファイルが含まれていても、何とか動的ロードがApache Sparkで機能しません。なぜそうなのか?そして、どうやって静的リンクを持つスタンドアロンのnumpyモジュールを作成していますか?

ありがとうございました。

+0

あなたはzipファイルを作成する方法を示してもらえますか? – zero323

+0

@ zero323: 'zip -r〜/ numpy.zip/usr/local/lib/python2.7/dist-packages/numpy' – abhinavkulkarni

+0

既存のインストールをコピーしようとしていますか?'須藤はapt-getをインストールのpython-numpy':はい、既存の' numpy'のインストールには、コマンドを実行して、 'Ubuntu'マシンにインストールされました: – zero323

答えて

6

あなたのアプローチには少なくとも2つの問題があり、両方をNumPyが重量のある依存関係であるという単純な事実に還元することができます。まず、すべてのDebianパッケージの

  • libgfortranlibblasliblapacklibquadmathを含む複数の依存関係が付属しています。だからあなたは単純にNumPyのインストールをコピーすることはできませんし、事が動作することを期待することはできません(そうでない場合は正直言ってこのようなことをしないでください)。理論的には、静的リンクを使用してビルドしようとする可能性があり、この方法ですべての依存関係を出荷することができますが、2番目の問題に当てはまります。

  • NumPyはかなり大きくなっています。 20MBは特に印象的ではありませんが、40MBを超えてはならないすべての依存関係で、仕事を始めるたびに従業員に出荷されなければなりません。より多くの労働者があなたが悪化しています。あなたがSciPyまたはSciKitが必要であると判断した場合、それはずっと悪化する可能性があります。

おそらく、NumPyは、pyFileメソッドで出荷されるための本当に悪い候補になります。

作業者に直接アクセスすることはできませんでしたが、ヘッダーファイルや静的ライブラリを含むすべての依存関係が存在していた場合は、単にタスク自体からユーザー空間にNumPyをインストールしてみてください(pipこのようなもので)にもインストールされています:

try: 
    import numpy as np 

expect ImportError: 
    import pip 
    pip.main(["install", "--user", "numpy"]) 
    import numpy as np 

あなたは、労働者へのアクセス権を持っているので、はるかに優れたソリューションは、独立したPython環境を作成することですHow to install and import Python modules at runtime?

に、この方法の他の変形を見つけることができます。おそらく最も単純なアプローチは、Anacondaを使用することです。これは、Python以外の依存関係をパッケージ化するためにも使用でき、システム全体のライブラリには依存しません。 AnabilitiesやFabricなどのツールを使用してこのタスクを簡単に自動化することができます。管理権限を必要とせず、基本的なインストーラー(wget、curl、rsync、scp)をフェッチするためのbashと本当に必要なものです。

も参照してください:shipping python modules in pyspark to other nodes?

関連する問題