2017-06-03 67 views
1

我知道映射器何時將其輸出存儲到本地硬盤?

映射器的輸出(中間數據)存儲每個單獨的映射數據的節點的本地文件系統(未HDFS)上。這通常是臨時目錄,可以由Hadoop管理員在配置中設置。一旦Mapper作業完成或數據傳輸到Reducer,這些中間數據就會被清理乾淨並且無法訪問。

但是,我想知道映射器何時將其輸出存儲到本地硬盤?是否因爲數據太大而無法存儲?只有正在處理的數據保留在內存中?如果數據很小並且整個數據可以放在內存中,那麼沒有磁盤參與?

在mapper m/c的硬盤沒有介入的情況下,我們能不能直接將數據在mapper中處理後從mapper轉移到reducer。我的意思是當數據在映射器中被處理時,它在內存中,一旦計算出來,它就直接傳遞給reducer,映射器可以傳遞下一塊數據,類似地沒有磁盤捲入。

在spark中,據說有內存中的計算,與上面有什麼不同?什麼讓火花計算內存比地圖減少更好?另外,如果數據過於龐大,那麼就會出現磁盤捲入的情況。

請解釋

回答

1

很多問題在這裏。我會盡力解釋每一個。

映射器何時將其輸出存儲到本地硬盤?

映射器將數據存儲在配置的內存中。當內存已滿80%(可重新配置)時,它會對內存中的數據運行組合器以減少數據。但是,當組合數據也超過了這個內存限制時,它就會溢出到磁盤上。這些文件被稱爲溢出文件。整個操作過程中,會寫入多個溢出文件。在編寫溢出文件時,映射器按照縮減器對數據進行排序和分區。在地圖操作結束時,需要合併這些溢出文件。

如果沒有映射器m/c的硬盤捲入,我們是不是可以直接將數據在映射器中處理後從映射器轉移到reducer中。

任何處理中最耗費的操作是機器之間的「數據傳輸」。減少地圖的整個範例是將處理靠近數據而不是移動數據。因此,如果它按照你所建議的方式完成,就會有很多數據移動。與在網絡上寫入相比,寫入本地磁盤的速度更快。通過合併溢出文件可以減少這些數據。 排序是在溢出文件時完成的,因爲它更容易(更快)地合併排序後的數據。分區完成後,因爲您只需要合併相同的分區(數據將轉到同一個reducer)。在合併過程中,組合器再次運行以減少數據。這個減少的數據然後被髮送到減速器。

在spark中,據說有內存計算,這與上面有什麼不同?

火花和地圖縮小程序在你從某些數據集中讀取,執行一個地圖功能和一個縮小功能時沒有區別。它將在磁盤上執行與mapreduce代碼相同的讀寫操作。當您需要在同一數據集上運行少量操作時,就會出現差異。在map reduce中,每次操作都會從磁盤讀取,但在spark中,您可以選擇使用內存來存儲它,在這種情況下,它只會從磁盤讀取一次,後面的操作應該在存儲器中運行,這顯然會更快。 或者在第1次操作的輸出被輸入到第2次的操作連鎖的情況下。在Mapreduce中,第一個操作的輸出將被寫入磁盤並在第二個操作中從磁盤讀取,而在spark中,您可以將第一個操作的輸出保存在內存中,以便第二個操作從內存中讀取並且應該更快。

+0

非常感謝你這麼深入的回答。但是,通過mapreduce分區,你的意思是洗牌嗎?這裏他們是一樣的嗎? –

+0

閱讀此https://stackoverflow.com/questions/22141631/what-is-the-purpose-of-shuffling-and-sorting-phase-in-the-reducer-in-map-reduce –

+0

你一直非常有幫助,你也可以請回答這個問題[鏈接](https://stackoverflow.com/questions/44351229/what-does-the-shuffling-phase-actually-do)..感謝很多 –

相關問題