1. 程式人生 > >spark中saveAsTextFile如何最終生成一個檔案

spark中saveAsTextFile如何最終生成一個檔案

在預設的textfile中,如果從hdfs中讀取檔案,原始碼中預設的分割槽數是2,如果想改變分割槽數,可以在textfile中設定第二個引數“分割槽數”

一般而言,saveAsTextFile會按照執行task的多少生成多少個檔案,比如part-00000一直到part-0000n,n自然就是task的個數,亦即是最後的stage的分割槽數。那麼有沒有辦法最後只生成一個檔案,而不是成百上千個檔案了?

答案自然是有辦法。
在RDD上呼叫coalesce(1,true).saveAsTextFile(),意味著做完計算之後將資料彙集到一個分割槽,然後再執行儲存的動作,顯然,一個分割槽,Spark自然只起一個task來執行儲存的動作,也就只有一個檔案產生了。又或者,可以呼叫repartition(1),它其實是coalesce的一個包裝,預設第二個引數為true。


事情最終就這麼簡單嗎?顯然不是。

你雖然可以這麼做,但代價是巨大的。因為Spark面對的是大量的資料,並且是並行執行的,如果強行要求最後只有一個分割槽,必然導致大量的磁碟IO和網路IO產生,並且最終執行reduce操作的節點的記憶體也會承受很大考驗。Spark程式會很慢,甚至死掉。
這往往是初學Spark的一個思維陷阱,需要改變原先那種單執行緒單節點的思維,對程式的理解要轉變多多個節點多個程序中去,需要熟悉多節點叢集自然產生多個檔案這種模式。
此外,saveAsTextFile要求儲存的目錄之前是沒有的,否則會報錯。所以,最好程式中儲存前先判斷一下目錄是否存在。