2015-12-19 130 views
6

我正在大型集羣上運行Spark程序(爲此,我沒有管理權限)。 numpy未安裝在工作節點上。因此,我捆綁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

所以你試圖複製現有的安裝? – zero323

回答

6

你的方法至少有兩個問題,都可以簡化爲一個簡單的事實,即NumPy是一個重量級的依賴項。

  • 所有Debian軟件包首先配備了多個依賴包括libgfortranlibblasliblapacklibquadmath。所以你不能簡單地複製NumPy安裝,並期望事情能夠起作用(說實話,如果情況並非如此,你不應該這樣做)。理論上你可以嘗試使用靜態鏈接來構建它,這種方式將它與所有的依賴關係一起發佈,但它遇到了第二個問題。

  • 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 

你會發現這種方法的其他變體在How to install and import Python modules at runtime?

既然你可以訪問工人更好的解決方案是創建一個單獨的Python環境。可能最簡單的方法是使用Anaconda,它可以用來打包非Python依賴關係,而不依賴於系統範圍的庫。您可以使用Ansible或Fabric等工具輕鬆自動執行此任務,它不需要管理權限,您真正需要的只是bash和某些獲取基本安裝程序(wget,curl,rsync,scp)的方式。

另請參閱:shipping python modules in pyspark to other nodes?