2016-06-30 112 views
2

閱讀和this讓我覺得有可能有​​一個python文件被執行​​但我無法得到它的工作。使用火花提交與蟒蛇主

我的設置有點複雜。我需要將幾個不同的jar文件與我的python文件一起提交,以便使所有功能都可用。我pyspark命令,它的工作原理是這樣的:

IPYTHON=1 ./pyspark --jars jar1.jar,/home/local/ANT/bogoyche/dev/rhine_workspace/env/Scala210-1.0/runtime/Scala2.10/scala-library.jar,jar2.jar --driver-class-path jar1.jar:jar2.jar 
from sys import path 
path.append('my-module') 
from my-module import myfn 
myfn(myargs) 

我已經打包的雞蛋裏面我的Python文件和雞蛋中含有的主要文件,通過調用python myegg.egg

我現在想使雞蛋可執行以形成我的​​命令,我似乎無法做到。這裏就是我:

./spark-submit --jars jar1.jar,jar2.jar --py-files path/to/my/egg.egg arg1 arg 
Error: Cannot load main class from JAR file:/path/to/pyspark/directory/arg1 
Run with --help for usage help or --verbose for debug output 

代替執行我.egg文件,它走的是雞蛋的第一個參數,並認爲這是一個jar文件,並嘗試從它加載一個類?我究竟做錯了什麼?

回答

2

其中一種方法是將Spark應用程序的主驅動程序作爲必須傳遞給spark-submit的python文件(.py)。這個主要腳本有幫助Driver識別入口點的主要方法。該文件將自定義配置屬性,初始化SparkContext。

捆綁在egg可執行文件中的那些是依賴項,這些依賴項被髮送到執行程序節點並在驅動程序內導入。

您可以腳本的小文件爲主要驅動力和執行 -

./spark-submit --jars jar1.jar,jar2.jar --py-files path/to/my/egg.egg driver.py arg1 arg 

驅動程序會是這樣的 -

from pyspark import SparkContext, SparkConf 
from my-module import myfn 

if __name__ == '__main__': 
    conf = SparkConf().setAppName("app") 
    sc = SparkContext(conf=conf) 
    myfn(myargs, sc) 

傳遞火花上下文對象作爲參數的任何需要的地方。

+0

謝謝。我只是想明白了。然而,它只適用於我的本地機器,而不適用於Map Reduce集羣; /由於某種原因,只要我提供帶有額外jar的「--driver-class-path」選項,我會覆蓋默認值(我認爲)結果我得到一個錯誤'py4j.protocol.Py4JJavaError:調用None.org.apache.spark.api.java.JavaSparkContext時發生錯誤。 :java.lang.NoSuchMethodError:org.apache.http.impl.client.DefaultHttpClient.execute(Lorg/apache/http/client/methods/HttpUriRequest;)Lorg/apache/http/client/methods/CloseableHttpResponse;'想法? – XapaJIaMnu

+0

恐怕很難分析在這種情況下確切的問題,而不看你的實際程序和環境變量 –

+1

問題是從我的胖罐子和火花壇版本之間的版本衝突。謝謝你的幫助! – XapaJIaMnu