首先,當一個動作(如count
,collect
或write
)被調用時,Spark纔開始讀取數據。一旦一個動作被調用,Spark會加載分區中的數據 - 併發加載分區的數量取決於您可用的核心數量。所以在Spark中你可以想到1分區= 1核心= 1任務。請注意,所有同時加載的分區都必須裝入內存,否則您將得到一個OOM。
假設您有幾個階段,則Spark將僅從已加載分區的第一階段運行轉換。一旦它對已加載分區中的數據應用了轉換,它將輸出存儲爲shuffle-data,然後讀入更多分區。然後,它對這些分區應用轉換,將輸出存儲爲shuffle-data,讀入更多分區等等,直到讀取完所有數據。
如果您不應用轉換,但僅應用於例如count
,Spark仍會讀取分區中的數據,但它不會在羣集中存儲任何數據,並且如果您再次執行count
,它將讀取所有數據再次。爲避免多次讀取數據,您可以撥打cache
或persist
,在這種情況下,Spark 將嘗試將數據存儲在您的羣集中。在cache
(與persist(StorageLevel.MEMORY_ONLY)
相同,它會將所有分區存儲在內存中 - 如果它不適合存儲在內存中,您將得到一個OOM。如果您撥打persist(StorageLevel.MEMORY_AND_DISK)
,它將盡可能多地存儲在內存中,其餘的將會是如果數據不符合磁盤要麼操作系統通常會殺死你的工作人員
請注意,Spark有它自己的小內存管理系統,你分配給你的Spark作業的一些內存用於保存數據正在研發中,一些內存用於存儲,如果你打電話cache
或persist
。
我希望這樣的解釋有助於:)
Spark如何處理大型數據文件取決於您在讀取數據後對數據做了什麼。如果調用'cache',您將得到一個OOM,但它只是在執行一些操作,Spark會自動溢出到磁盤當它填滿記憶。如果數據數量超過集羣磁盤上的數據量,那麼工作人員的操作系統通常會終止進程,您需要在磁盤(或內存)上進行擴展才能完成作業。 –
感謝您的指導,但在Spark讀取數據/文件時,絕對會存儲它讀取的數據。因此,它將在哪裏存儲這些數據。如果它不存儲讀取文件時發生的情況。 –