分布式文件系統(tǒng)HDFS中Block介紹
Block概念
磁盤有一個(gè)Block size的概念,它是磁盤讀/寫數(shù)據(jù)的最小單位。構(gòu)建在這樣的磁盤上的文件系統(tǒng)也是通過塊來管理數(shù)據(jù)的,文件系統(tǒng)的塊通常是磁盤塊的整數(shù)倍。文件系統(tǒng)的塊一般為幾千字節(jié)(byte),磁盤塊一般為512字節(jié)(byte)。
HDFS也有Block的概念,但它的塊是一個(gè)很大的單元,默認(rèn)是64MB。像硬盤中的文件系統(tǒng)一樣,在HDFS中的文件將會(huì)按塊大小進(jìn)行分解,并作為獨(dú)立的單元進(jìn)行存儲(chǔ)。但和硬盤中的文件系統(tǒng)不一樣的是,存儲(chǔ)在塊中的硬的一個(gè)比塊小的文件并不會(huì)占據(jù)一個(gè)塊大小盤物理空間(HDFS中一個(gè)塊只存儲(chǔ)一個(gè)文件的內(nèi)容)。
那為什么HDFS中的塊如此之大呢?
在HDFS學(xué)習(xí)(一) – HDFS設(shè)計(jì)中,我們?cè)f過,對(duì)HDFS來說,讀取整個(gè)數(shù)據(jù)的時(shí)間延遲要比讀取到第一條記錄的數(shù)據(jù)延遲更重要,就體現(xiàn)在這里。HDFS的Block設(shè)計(jì)的如此之大,也就是為了最小化尋道時(shí)間。把一個(gè)數(shù)據(jù)塊設(shè)計(jì)的足夠大,就能夠使得數(shù)據(jù)傳輸?shù)臅r(shí)間顯著地大于尋找到Block所在時(shí)間。這樣,傳輸一個(gè)由多個(gè)Block組成的文件的時(shí)間就取決于磁盤的傳輸速率。
舉一個(gè)簡(jiǎn)單的例子,假設(shè)尋道時(shí)間大約為10ms,傳輸速度為100MB/s。為了使得尋道時(shí)間僅為傳輸時(shí)間的1%,我們就需要設(shè)置塊的大小為100MB。HDFS默認(rèn)的Block size是64MB,但是更多的企業(yè)里邊,已經(jīng)設(shè)置成128M,而且這個(gè)參數(shù)將隨著新一代硬盤速度的增長(zhǎng)而增長(zhǎng)。
而Block Size的值也不宜設(shè)置過大,通常,Mapreduce中的Map任務(wù)一次只處理一個(gè)Block中的數(shù)據(jù),如果啟動(dòng)太少的Task(少于集群中的節(jié)點(diǎn)的數(shù)量),作業(yè)的速度就會(huì)比較慢。
對(duì)HDFS進(jìn)行塊抽象有哪些好處呢?
一、一個(gè)顯而易見的好處是:一個(gè)文件的大小,可以大于網(wǎng)絡(luò)中任意一個(gè)硬盤的大小。
文件的塊并不需要存儲(chǔ)在同一個(gè)硬盤上,一個(gè)文件的快可以分布在集群中任意一個(gè)硬盤上。事實(shí)上,雖然實(shí)際中并沒有,整個(gè)集群可以只存儲(chǔ)一個(gè)文件,該文件的塊占滿整個(gè)集群的硬盤空間。
二、使用抽象塊而非整個(gè)文件作為存儲(chǔ)單元,大大簡(jiǎn)化了系統(tǒng)的設(shè)計(jì)。
簡(jiǎn)化設(shè)計(jì),對(duì)于故障種類繁多的分布式系統(tǒng)來說尤為重要。以塊為單位,一方面簡(jiǎn)化存儲(chǔ)管理,因?yàn)閴K大小是固定的,所以一個(gè)硬盤放多少個(gè)塊是非常容易計(jì)算的;另一方面,也消除了元數(shù)據(jù)的顧慮,因?yàn)锽lock僅僅是存儲(chǔ)的一塊數(shù)據(jù),其文件的元數(shù)據(jù),例如權(quán)限等就不需要跟數(shù)據(jù)塊一起存儲(chǔ),可以交由另外的其他系統(tǒng)來處理。
三、塊更適合于數(shù)據(jù)備份,進(jìn)而提供數(shù)據(jù)容錯(cuò)能力和系統(tǒng)可用性。
為了防止數(shù)據(jù)塊損壞或者磁盤或者機(jī)器故障,每一個(gè)block都可以被分到少數(shù)幾天獨(dú)立的機(jī)器上(默認(rèn)3臺(tái))。這樣,如果一個(gè)block不能用了,就從其他的一處地方,復(fù)制過來一份。詳細(xì)的關(guān)于HDFS數(shù)據(jù)完整性的問題,將在《Hadoop I/O學(xué)習(xí)(一) – 數(shù)據(jù)完整性》中詳細(xì)介紹。
原文鏈接:http://shitouer.cn/2012/12/hdfs-block-introduction/
編輯推薦】