2013-07-18 102 views
17

我正在通過hadoop權威指南,它清楚地解釋了輸入分割。 它是這樣Hadoop輸入分割大小與塊大小

輸入拆分不包含實際數據,而它具有存儲 位置數據在HDFS

通常情況下,輸入分配的大小與塊大小相同

1)假設一個64MB的塊位於節點A上,並在2個其他節點(B,C)之間複製,並且map-reduce程序的輸入分割大小爲64MB,那麼這個分割對於節點A而言是否具有位置?或者它是否具有所有三個節點A,b,C的位置?

2)由於數據對所有三個節點都是本地的,框架如何決定(選擇)一個在特定節點上運行的maptask?

3)如果輸入拆分大小大於或小於塊大小,它是如何處理的?

回答

16
  • 有點不同通過答案@ user1668782是一個很好的解釋對於這個問題,我會嘗試給出一個圖形化的描述。

  • 假設我們有400MB一個文件由4條:400MB的CSV文件,它有4個排,每100MB)

enter image description here

  • 如果HDFS 塊大小被配置爲128MB,那麼4條記錄將不會均勻地分佈在這些塊之間。它看起來像這樣。

enter image description here

  • 塊1包含整個第一記錄和第二記錄的28MB塊。
  • 如果要在塊1上運行映射程序,映射程序將無法處理,因爲它不會有整個第二條記錄。
  • 這是確切的問題,輸入拆分解決。 輸入拆分尊重邏輯記錄邊界。

  • 讓我們假設該輸入分割大小是200MB

enter image description here

  • 因此輸入分配1應該同時具有記錄1和記錄2.與由於記錄2已分配給輸入分割1,輸入分割2不會以記錄2開始。輸入分割2將以記錄3開始。

  • 這就是爲什麼輸入拆分只是一個邏輯塊的數據。它指向以塊爲單位的開始和結束位置。

希望這會有所幫助。

+2

爲什麼輸入拆分2和3的大小是100 MB,第一個是200 MB? – ssinganamalla

+0

我們可以爲每個塊分配不同的輸入分配嗎?或者它只是邏輯表示 – Akki

0

對於1)和2):我不是100%肯定的,但是如果任務無法完成 - 無論出於何種原因,包括輸入拆分有什麼問題 - 然後終止並且另一個開始place:因此每個maptask都只有一個包含文件信息的分割(你可以通過調試本地集羣來查看是否屬於這種情況,以查看輸入分割對象中保存了哪些信息:我似乎記得它只是一個位置) 。

到3):如果文件格式是可拆分的,那麼Hadoop將嘗試將文件剪切爲「inputSplit」大小的塊;如果不是,那麼無論文件大小如何,它都是每個文件的一個任務。如果更改minimum-input-split的值,那麼如果每個輸入文件被劃分爲塊大小,則可以防止產生過多的映射器任務,但如果您執行某些操作,只能將合併爲輸入與組合類的魔法(我認爲這就是所謂的)。

+0

我認爲「節點鄰近」的概念回答問題1和2. – rohith

+0

輸入拆分是邏輯的,它實際上並不包含文件數據。它引用了存儲塊的位置(節點)。 – rohith

4

輸入拆分是記錄的邏輯劃分,而HDFS塊是輸入數據的物理分區。當它們相同時它效率非常高,但實際上它從來沒有完全一致。記錄可能會跨越塊邊界。 Hadoop保證處理所有記錄。處理特定分割的機器可以從除「主」塊之外的塊獲取記錄的片段,並且該片段可以遠程駐留。獲取記錄片段的通信成本是無關緊要的,因爲它發生得相對較少。

0

Hadoop框架的優勢在於它的數據本地化。因此,無論何時客戶端請求hdfs數據,框架總是檢查本地,否則它會尋找很少的I/O利用率。

19

塊是數據的物理表示。分割是Block中數據的邏輯表示。

塊和拆分大小可以在屬性中更改。

地圖通過拆分從塊中讀取數據,即拆分作爲塊和映射器之間的代理。

考慮兩個塊:

塊1

AA BB CC DD EE FF GG HH II JJ

塊2

WW EE YY UU二OO oo pp kk ll nn

現在地圖讀取塊1,直到aa到JJ,並且不知道如何讀取塊2,即塊不知道如何處理不同的信息塊。這裏有一個Split,它將形成Block 1和Block 2的邏輯分組爲單塊,然後使用輸入格式和記錄閱讀器形成偏移(鍵)和行(值)併發送映射以進行進一步處理。

如果您的資源有限,並且您想限制地圖數量,則可以增加分割大小。 例如: 如果我們有640 MB的10塊,即每塊64 MB和資源是有限的,那麼你可以提到分割大小爲128 MB,然後形成128 MB的邏輯分組,並且只有5個地圖將被執行大小爲128 MB。

如果我們指定拆分大小爲假,那麼整個文件將形成一個輸入拆分並由一個地圖處理,當文件很大時需要更多時間來處理它。

+1

如果block1在machine1上,block2在machine2上。假設地圖在機器1上運行,如果拆分大小是塊大小的兩倍。 machine1上的map函數是否從machine2中獲取block2來處理? – user2626445

+2

是map1從machine2獲取block2來處理 –

+0

輸入split可以小於塊大小嗎? –

0

HDFS塊大小是精確數字,但輸入分割大小是基於我們的 數據邏輯,其可以是與配置的數目

0

輸入拆分是饋送給每個映射器的邏輯數據單元。數據分爲有效記錄。輸入拆分包含塊地址和字節偏移量。

比方說,您有一個跨越4個塊的文本文件。

文件:

A B C d
E F G H
I J K L
米2 N 2 O p

塊:

BLOCK1:ABCDE
BLOCK2:FGHIJ
BLOCK3:KLMNO
塊4:P

拆分:

分割1:abcdefh
Split2:ijklmnop

觀察分裂是內聯與來自文件的邊界(記錄)。現在,每個分割都被送到一個映射器。

如果輸入拆分大小小於塊大小,則最終將使用更多的mapper,反之亦然。

希望有所幫助。

相關問題