詳解Hadoop核心架構HDFS
在Hadoop入門學習階段,很多同學都知道Hadoop框架當中,由HDFS提供分佈式存儲支持,因此常常對HDFS產生誤會:HDFS是數據庫嗎? HDFS是什麼數據庫?事實上,HDFS並非是數據庫,官方定義叫做分佈式文件系統,該怎麼去理解呢?
1. 產生背景及定義
HDFS:分佈式文件系統,用於存儲文件,主要特點在於其分佈式,即有很多服務器聯合起來實現其功能,集群中的服務器各有各的角色。
隨著數據量越來越大,一個操作系統存不下所有的數據,那麼就分配到更多的操作系統管理的磁盤中,但是管理和維護極不方便,於是迫切需要一種系統來管理多台機器上的文件,這就是分佈式管理系統,HDFS是其中一種。
HDFS的使用適合一次寫入,多次讀出的場景,且不支持對文件的直接修改,僅支持在文件末尾追加
HDFS採用流式的數據訪問方式:特點就是像流水一樣,數據不是一次過來,而是一點一點“流”過來,處理數據也是一點一點處理。如果是數據全部過來之後才處理,那麼延遲就會很大,而且會消耗很大的內存。
隨著數據量越來越大,一個操作系統存不下所有的數據,那麼就分配到更多的操作系統管理的磁盤中,但是管理和維護極不方便,於是迫切需要一種系統來管理多台機器上的文件,這就是分佈式管理系統,HDFS是其中一種。
HDFS的使用適合一次寫入,多次讀出的場景,且不支持對文件的直接修改,僅支持在文件末尾追加
HDFS採用流式的數據訪問方式:特點就是像流水一樣,數據不是一次過來,而是一點一點“流”過來,處理數據也是一點一點處理。如果是數據全部過來之後才處理,那麼延遲就會很大,而且會消耗很大的內存。
2. 為什麼選擇 HDFS 存儲數據
之所以選擇 HDFS 存儲數據,因為 HDFS 具有以下優點。
高容錯性:數據自動保存多個副本,副本丟失後,自動恢復
適合批處理:移動計算而飛數據。數據位置暴露給計算框架
適合大數據處理:GB,TB,設置PB級數據。百萬規模以上文件數量。 10K+節點規模。
流式文件訪問:一次性寫入,多次讀取。保證數據一致性。
可構建在廉價機器上:通過多副本提高可靠性。提供容錯和恢復機制。
高容錯性:數據自動保存多個副本,副本丟失後,自動恢復
適合批處理:移動計算而飛數據。數據位置暴露給計算框架
適合大數據處理:GB,TB,設置PB級數據。百萬規模以上文件數量。 10K+節點規模。
流式文件訪問:一次性寫入,多次讀取。保證數據一致性。
可構建在廉價機器上:通過多副本提高可靠性。提供容錯和恢復機制。
3. HDFS的缺點
不適合低時間延遲的訪問:如果要處理一些用戶要求時間比較短的低延遲應用請求,則HDFS不適合。 HDFS是為了處理大型數據集分析任務的,主要是達到高的數據吞吐量而設計的,這就可能要求以高延遲作為代價。
無法高效存儲小文件: 因為nameNode把文件系統的元數據放置在內存中,所以文件系統所能容納的文件數目是由NameNode的內存大小來決定的,一般來說,每一個文件、文件夾和Block需要佔據150字節左右的空間,所以,如果你有100萬個文件,每一個佔據一個Block,你就至少需要300MB的內存,當前來說,數百萬的文件還是可行的,當擴展到數十億時,對於當前的硬件水平來說就無法實現了。還有一個問題就是,因為Map task的數量是由splits來決定的,所以用MR處理大量小文件時,就會產生過多的Maptask,線程管理開銷將會增加作業時間。舉個例子,處理10000M的文件,若每個split為1M,那麼就會有10000個maptasks,會有很大的線程開銷;若每個split為100M,則100個Maptasks,每個maptask將會有更多的事情做,而線程的管理開銷也將會減小很多。
不支持多用戶寫入及任意修改文件:一個文件只有一個寫線程,不能多個線程同時讀寫,而且寫操作只能在文件末尾完成,僅支持文件的追加,不支持修改。
無法高效存儲小文件: 因為nameNode把文件系統的元數據放置在內存中,所以文件系統所能容納的文件數目是由NameNode的內存大小來決定的,一般來說,每一個文件、文件夾和Block需要佔據150字節左右的空間,所以,如果你有100萬個文件,每一個佔據一個Block,你就至少需要300MB的內存,當前來說,數百萬的文件還是可行的,當擴展到數十億時,對於當前的硬件水平來說就無法實現了。還有一個問題就是,因為Map task的數量是由splits來決定的,所以用MR處理大量小文件時,就會產生過多的Maptask,線程管理開銷將會增加作業時間。舉個例子,處理10000M的文件,若每個split為1M,那麼就會有10000個maptasks,會有很大的線程開銷;若每個split為100M,則100個Maptasks,每個maptask將會有更多的事情做,而線程的管理開銷也將會減小很多。
不支持多用戶寫入及任意修改文件:一個文件只有一個寫線程,不能多個線程同時讀寫,而且寫操作只能在文件末尾完成,僅支持文件的追加,不支持修改。