2

我將使用大量的結構化文件的如下:火花劃分/集羣執行

/day/hour-min.txt.gz 

以總共14天。我將使用一個由90個節點/工人組成的羣集。

我正在閱讀與wholeTextFiles()的所有內容,因爲它是允許我正確分割數據的唯一方法。所有的計算都將在每分鐘的基礎上完成(所以基本上每個文件),並在最後減少一些步驟。大約有20,000個文件;如何有效地對其進行分區?我是否讓火花決定?

理想情況下,我認爲每個節點應該接收整個文件;默認情況下,火花會這樣做嗎?我可以執行它嗎?怎麼樣?

+0

你的輸入文件在哪裏? HDFS/S3/..? –

+0

HDFS <加長評論> – Dimebag

回答

2

我覺得每個節點應該接收整個文件;默認情況下,火花會這樣做嗎?

是的,因爲WholeTextFileRDD(你sc.wholeTextFiles後會得到什麼)有自己的WholeTextFileInputFormat讀取整個文件作爲一個單獨的記錄,你覆蓋。如果您的Spark執行程序和數據節點位於同一位置,則還可以期望節點本地數據位置。對於sc.wholeTextFiles(您可以在星火UI一旦你的應用程序運行檢查這一點。)

從注withing星火文檔注意的一點是:

小文件是首選,大文件也是允許的,但可能會導致 性能不佳。

+0

只是要清楚,你的意思是我應該實現我自己的'wholeTextFileInputFormat'?或者是默認實施好? – Dimebag

+1

不,您不需要爲此實現自己的輸入格式。它已經提供。請記住,如果你的文件很大,那麼它可能會被分割到許多hdfs塊中,你的RDD將不得不讀取這些塊(可能來自非本地數據節點)來爲文件構造單個記錄。對於大文件,處理單個文件所需的內存也很大。這是謹慎對待使用wholeTextFiles進行大型RDD的基本思想。除此之外,你幾乎被覆蓋。 –

1

你可以用拇指規則你的分區:

data = data.coalesce(total_cores * 3) 

理想情況下,我認爲每個節點應該得到整個文件;默認情況下,火花會這樣做嗎?我可以執行它嗎?怎麼樣?

這一切都取決於你的RDD,而不是你的文件。例如,如果構建包含文件所有內容的RDD,則Spark將分發該RDD,並且整個文件是否位於節點中受許多參數(#分區,每個文件的大小等)的影響。

我不認爲你可以強制這樣的事情,所以專注於分區的數量;這是至關重要的。


至於文件的數目,我已經寫在我的pseudosite,太少的文件,會造成巨大的文件,可能只是太大,太多的文件,你將有HDFS維護量巨大的元數據,因此給它施加了很大的壓力。

相關問題