2015-10-27 55 views
5

火花簇我有我通過谷歌dataproc產生火花集羣。我希望能夠使用數據文件中的csv庫(請參閱https://github.com/databricks/spark-csv)。所以我第一次測試是這樣的:使用pyspark作業的外部庫中,谷歌,dataproc

我開始SSH會話與我集羣的主節點,然後我輸入:

pyspark --packages com.databricks:spark-csv_2.11:1.2.0 

然後又推出了pyspark殼中,我輸入:

df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('gs:/xxxx/foo.csv') 
df.show() 

它的工作。

我的下一個步驟是使用下面的命令從我的主機啓動該作業:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> my_job.py 

但在這裏它不工作,我得到一個錯誤。我想因爲我沒有給出--packages com.databricks:spark-csv_2.11:1.2.0作爲論據,但我嘗試了10種不同的方式來給它,我沒有管理。

我的問題是:

  1. 安裝了databricks CSV庫我輸入pyspark --packages com.databricks:spark-csv_2.11:1.2.0
  2. 後,我可以寫我的job.py線,以進口嗎?
  3. 或我應該給我的gcloud命令導入或安裝它的參數?
+2

Dataproc中有一個JARS沒有被Pyspark工作接受的錯誤。我正在尋找一種替代解決方案。我只是想讓你知道我們正在查看更大的錯誤,而且我看到我們是否也可以爲你臨時修復。 :) – James

+0

希望在這裏也有解決方法和解決方法,thx @James!我們試圖從python和scala的cassandra連接器中使用dataproc – navicore

回答

9

簡答

有在哪裏--packages不被接受​​參數排序怪癖如果它的my_job.py爭吵後。要解決這一點,可以從Dataproc的CLI提交時,做到以下幾點:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \ 
    --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py 

基本上,只是.py文件在您的命令前加上--properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0

長的答案

所以,這實際上是一個不同的問題比已知缺乏gcloud beta dataproc jobs submit pyspark--jars支持;看來如果沒有Dataproc將--packages明確識別爲特殊的​​級別標誌,它會嘗試在之後將傳遞給應用程序參數,以便spark-submit讓--packages作爲應用程序參數而不是將其正確地解析爲提交 - 級別選項。事實上,在一個SSH會話,下面做工作:

# Doesn't work if job.py depends on that package. 
spark-submit job.py --packages com.databricks:spark-csv_2.11:1.2.0 

但切換的參數的順序不會再工作,即使在pyspark情況下,兩個排序工作:

# Works with dependencies on that package. 
spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py 
pyspark job.py --packages com.databricks:spark-csv_2.11:1.2.0 
pyspark --packages com.databricks:spark-csv_2.11:1.2.0 job.py 

因此,儘管spark-submit job.py應該是以前稱爲pyspark job.py的所有內容的替代品,但--packages之類的解析排序的差異意味着它實際上不是100%兼容的遷移。這可能是Spark方面需要跟進的一點。

無論如何,幸運的是有一個解決方法,因爲--packages只是Spark屬性spark.jars.packages的另一個別名,而Dataproc的CLI支持屬性就好了。所以,你可以做到以下幾點:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \ 
    --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py 

注意,--properties必須my_job.py來之前,否則就被髮送作爲一個應用參數,而不是作爲一個配置標誌。希望這對你有用!請注意,SSH會話中的等效項將爲spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py

+0

這對我有幫助,但我現在正在努力註冊一個除了我的包以外的新的存儲庫。我試着添加''--properties spark.jars.packages = org.elasticsearch:elasticsearch-hadoop:2.4.0,spark.jars.ivy = http:// conjars.org/repo''但是不知怎的,兩個正斜槓轉換成一個,並通過下面的驅動程序錯誤。你對這個錯誤有什麼想法/正確的方法來提供一個帶有兩個正斜槓的完全限定的URL:''線程中的異常「main」java.lang.IllegalArgumentException:basedir必須是絕對的:http:/conjars.org/repo/local'' – aeneaswiener

2

除了@丹尼斯。

請注意,如果你需要加載多個外部包,你需要指定,像這樣一個自定義的轉義字符:

--properties ^#^spark.jars.packages=org.elasticsearch:elasticsearch-spark_2.10:2.3.2,com.data‌​bricks:spark-avro_2.10:2.0.1 

注^#^權的包列表中。 查看gcloud topic escaping瞭解更多詳情。

相關問題