HDFS
? ?Hadoop的核心就是HDFS與MapReduce。那么HDFS又是基于GFS的設計理念搞出來的。
? ?HDFS全稱是Hadoop Distributed System。HDFS是為以流的方式存取大文件而設計的。適用于幾百MB,GB以及TB,并寫一次讀多次的場合。而對于低延時數據訪問、大量小文件、同時寫和任意的文件修改,則并不是十分適合。
?優點:
? ? ? 1)適合存儲非常大的文件
? ? ? 2)適合流式數據讀取,即適合“只寫一次,讀多次”的數據處理模式
? ? ? 3)適合部署在廉價的機器上
缺點:
? ? ? 1)不適合存儲大量的小文件,因為受Namenode內存大小限制
? ? ?2)不適合實時數據讀取,高吞吐量和實時性是相悖的,HDFS選擇前者
? ? ?3)不適合需要經常修改數據的場景
? ?數據塊:
? ? ?每個磁盤都有默認的數據塊大小,一般就是521字節。這是磁盤進行數據讀寫的最小單位。HDFS同樣也有塊(block)的概念,但是大得多,有64MB。與單一磁盤上的文件系統一樣,HDFS上的文件也被劃分為塊大小的多個分塊。但是還是有所不同,比如HDFS中小于一個塊大小的文件不會占據整個塊的空間。
? ? 對分布式文件系統中的快進行抽象的好處:
? ? 1)一個文件的大小可能會大于網絡中任意一個磁盤的容量,文件的所有塊并不需要存儲在同一個磁盤上,因此可以利用集群上的任意一個磁盤進行存儲,但是對于HDFS來說,它是存儲了一個文件。
? ? ? ? (這不就正是我們要的效果嗎)?
? ? 2)以抽象塊為存儲單元,簡化了設計。還方便塊的備份。
?
?
? ?
?
? ? ? ? ?HDFS的架構如上圖所示,總體上采用了 Master/Slave 的架構,主要有以下4個部分組成:
? ? ? ?1、Client
? ? ? ? ? ? 客戶端,就是我們通過調用接口實現的代碼。
? ? ? ?2、NameNode
? ? ? ? ? ?整個HDFS集群只有一個NameNode,它存儲整個集群文件分別的元數據信息。這些信息以fsimage和editlog兩個文件存儲在本地磁盤,Client通過這些元數據信息可以找到相應的文件。此外,NameNode還 ? ? ?負責監控DataNode的健康情況,一旦發現DataNode異常,就將其踢出,并拷貝其上數據至其它DataNode。
? ? ? 3、Secondary NameNode
? ? ? ? ? Secondary NameNode負責定期合并NameNode的fsimage和editlog。這里特別注意,它不是NameNode的熱備,所以NameNode依然是Single Point of Failure。它存在的主要目的是為了分擔一部分 ? ? ? ? ? ? NameNode的工作(特別是消耗內存的工作,因為內存資源對NameNode來說非常珍貴)。
? ? ? 4、DataNode
? ? ? ? ? ?DataNode負責數據的實際存儲。當一個 文件上傳 至HDFS集群時,它以Block為基本單位分布在各個DataNode中,同時,為了保證數據的可靠性,每個Block會同時寫入多個DataNode中(默認為3) ??
?
? ? ? 那么文件如何存儲的呢?
? ? ?要存儲的文件會分成很多塊,存到Datanode里。分塊的原則:除了最后一個數據塊,其它數據塊的大小相同,一般為64MB or 128MB。?每個數據塊有副本(一般為3):副本多了浪費空間。?
? ? 副本存儲:在大多數情況下,副本系數是3,HDFS的存放策略是將一個副本存放在本地機架的節點上,一個副本放在同一機架的另一個節點上,。
? ??
HDFS通信協議?
? ? ?所有的 HDFS 通訊協議都是構建在 TCP/IP 協議上。客戶端通過一個可 配置的端口連接到 Namenode , 通過 ClientProtocol 與 Namenode 交互。而 Datanode 是使用 DatanodeProtocol 與 Namenode 交互。再設計上, DataNode 通過周期性的向 NameNode 發送心跳和數據塊來保持和 NameNode 的通信,數據塊報告的信息包括數據塊的屬性,即數據塊屬于哪 個文件,數據塊 ID ,修改時間等, NameNode 的 DataNode 和數據塊的映射 關系就是通過系統啟動時 DataNode 的數據塊報告建立的。從 ClientProtocol 和 Datanodeprotocol 抽象出一個遠程調用 ( RPC ), 在設計上, Namenode 不會主動發起 RPC , 而是是響應來自客戶端和 Datanode 的 RPC 請求。?
? ? (這個在我們進行hadoop文件配置的時候就可以感受到,都是通過一個Ip地址加上一個端口號來訪問對方的)
? ? ? 文件讀取的過程如下:
- 使用HDFS提供的客戶端開發庫Client,向遠程的Namenode發起RPC請求;
- Namenode會視情況返回文件的部分或者全部block列表,對于每個block,Namenode都會返回有該block拷貝的DataNode地址;
- 客戶端開發庫Client會選取離客戶端最接近的DataNode來讀取block;如果客戶端本身就是DataNode,那么將從本地直接獲取數據.
- 讀取完當前block的數據后,關閉與當前的DataNode連接,并為讀取下一個block尋找最佳的DataNode;
- 當讀完列表的block后,且文件讀取還沒有結束,客戶端開發庫會繼續向Namenode獲取下一批的block列表。
- 讀取完一個block都會進行checksum驗證,如果讀取datanode時出現錯誤,客戶端會通知Namenode,然后再從下一個擁有該block拷貝的datanode繼續讀。
? ? ?寫入文件的過程如下:
- 使用HDFS提供的客戶端開發庫Client,向遠程的Namenode發起RPC請求;
- Namenode會檢查要創建的文件是否已經存在,創建者是否有權限進行操作,成功則會為文件創建一個記錄,否則會讓客戶端拋出異常;
- 當 客戶端開始寫入文件的時候,開發庫會將文件切分成多個packets,并在內部以數據隊列"data queue"的形式管理這些packets,并向Namenode申請新的blocks,獲取用來存儲replicas的合適的datanodes列表, 列表的大小根據在Namenode中對replication的設置而定。
- 開始以pipeline(管道)的形式將packet寫入所 有的replicas中。開發庫把packet以流的方式寫入第一個datanode,該datanode把該packet存儲之后,再將其傳遞給在此 pipeline中的下一個datanode,直到最后一個datanode,這種寫數據的方式呈流水線的形式。
- 最后一個datanode成功存儲之后會返回一個ack packet,在pipeline里傳遞至客戶端,在客戶端的開發庫內部維護著"ack queue",成功收到datanode返回的ack packet后會從"ack queue"移除相應的packet。
- 如 果傳輸過程中,有某個datanode出現了故障,那么當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除, 剩余的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持 replicas設定的數量。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
