2015-12-23 94 views
0

當在簇中處理時,是否可以將驅動程序節點中的spark程序結果的輸出寫入?如何引用執行spark-submit的本地文件系統?

df = sqlContext("hdfs://....") 
result = df.groupby('abc','cde').count() 
result.write.save("hdfs:...resultfile.parquet", format="parquet") # this works fine 

result = result.collect() 

with open("<my drivernode local directory>//textfile") as myfile: 
    myfile.write(result) # I'll convert to python object before writing 

有人可以提供一些想法如何引用我給的地方文件系統​​?

回答

3

tl; dr使用.(點),當前工作目錄由API解析。

0

從我的理解你的問題,你問在驅動程序或工作人員運行火花時保存本地文件。

這是可能的,並且非常簡單。

問題是,最終,驅動程序和工作人員正在運行python,因此您可以使用python「open」,「with」,「write」等。

要在工作人員中執行此操作,您需要在您的rdd上運行「foreach」或「map」,然後在本地保存(這可能非常棘手,因爲您可能在每個執行程序上有多個分區)。

在收集數據之後,從驅動程序中進行保存就更容易了,您可以使用常規python對象來保存數據,並且可以將其保存爲任何擱淺的pythonic方式。

當你保存的任何本地文件,可以說,它是對工人或司機,是容器,工人或司機在運行中創建的文件。一旦執行是在那些容器上刪除,您將無法訪問存儲在其中的任何本地數據。

解決這個問題的方法是在容器還活着的時候將這些本地文件移動到某個地方。您可以使用shell命令執行此操作,插入數據庫等。

例如,我使用這種技術將計算結果插入到MySQL中,而無需進行收集。作爲「地圖」操作的一部分,我將工作結果保存在本地,然後使用MySQL「LOAD DATA LOCAL INFILE」上載它們。

相關問題