2017-03-22 20 views
1

當在火花作業中需要jar文件時,需要通過2種方式將其添加到火花作業中:
1. --jar path option in命令。
2. SparkContext.addJar("path")
任何人都可以告訴我這兩種方式之間的區別嗎?
this question,答案是他們是相同的,只有優先權是不同的,但我不認爲這是真的。如果我以紗線集羣模式提交點火作業,如果根據official site的命令在選項--jars中未包含jar文件,則addJar()將不起作用。SparkContext.addJar在本地模式下不起作用

的--jars選項允許SparkContext.addJar功能,如果你 使用它與本地文件和紗線集羣模式下運行工作。如果您使用HDFS,HTTP,HTTPS, 或FTP文件,則不需要使用它 。

原因是驅動程序運行在與客戶機不同的機器上。所以看起來命令中的選項--jars來自客戶端,功能addJar()只能在驅動程序中的jar中工作。

然後我在本地模式下做了測試。

1. spark-shell --master local --jars path/to/jar

如果我在這種方式啓動火花殼,在罐子對象可在所使用的火花殼

2. spark-shell --master local

如果我開始火花殼通過這種方式並使用sc.addJar("path/to/jar"),jar文件中的對象不能被導入到spark-shell中,我得到了class cannot be found錯誤。

我的問題是:

爲什麼SparkContext.addJar()不以本地模式運行的方法是什麼?

SparkContext.addJar()--jars有什麼區別?

我的環境:hortonworks 2.5集羣和spark的版本是1.6.2。我很感激,如果有人能說出這些。

回答

3

那麼,經過一番研究,我找到了原因。只要在這裏發佈,如果有其他人蔘與到這個問題。

方法addJar()不會將jar添加到驅動程序的類路徑中。該方法所做的是在驅動程序節點中查找jar,分發到worker節點,然後添加到executors的classpath中。
因爲我在本地模式下提交我的火花作業,所以在火花作業中使用了驅動程序類路徑(我猜),因此無法找到通過方法addJar()添加的罐子。

爲了解決此問題,請使用--jars選項在提交火花作業時包含所有罐子,或使用​​添加罐子。
更多詳細信息可參見here

相關問題