2017-04-21 141 views
6

我構建了一個python module,我想將其導入到我的pyspark應用程序中。pyspark導入用戶定義的模塊或.py文件

我的包目錄結構是:

wesam/ 
|-- data.py 
`-- __init__.py 

簡單import wesam我pyspark腳本的頂部,導致ImportError: No module named wesam。我也嘗試將其壓縮並用--py-files作爲recommended in this answer與我的代碼一起發貨,但沒有運氣。

./bin/spark-submit --py-files wesam.zip mycode.py 

我也編程方式添加的文件通過this answer的建議,但我得到了同樣的錯誤ImportError: No module named wesam

.sc.addPyFile("wesam.zip") 

我在這裏錯過了什麼?

回答

12

事實證明,由於我在client mode中提交我的應用程序,因此我運行​​命令的機器將運行驅動程序並需要訪問模塊文件。

enter image description here

我通過添加下面一行到我.bashrc文件(或提交我的作業之前執行它)加入我的模塊,我是從提交我的工作節點上的PYTHONPATH環境變量。

export PYTHONPATH=$PYTHONPATH:/home/welshamy/modules 

而且解決了這個問題。由於該路徑位於驅動程序節點上,因此我無需使用--py-files對模塊進行壓縮和裝運,也可以使用sc.addPyFile()

解決任何pyspark模塊導入錯誤問題的關鍵是瞭解驅動程序還是工作者(或兩者)節點需要模塊文件。

重要 如果工人節點需要你的模塊文件,那麼你需要把它作爲一個zip壓縮包與--py-files和這種說法必須您之前.py文件的說法。例如,注意的參數在這些實例的順序:

這是正確的:

./bin/spark-submit --py-files wesam.zip mycode.py 

這是正確:

./bin/spark-submit mycode.py --py-files wesam.zip 
+0

這是非常明確的,有益的。謝謝! – watsonic

+0

雖然這可能會起作用,但您可以通過您的(大概)全局分配的$ HOME/.bashrc有效地將env加入。 是否真的沒有辦法動態設置工作模塊的PYTHONPATH? 你想這樣做的原因是,你正在從ipython REPL進行交互,並希望發佈依賴於PYTHONPATH中NFS模塊的並行作業(請考慮python setup.py開發模式)。 – mathtick

相關問題