塊:一個磁盤有它的塊的大小,表明着它可以讀寫的最小數據量.文件系統經過處理大小爲一個磁盤快大小的整數倍的數據塊來運行這個磁盤.HDFS的塊比磁盤的大.目的是爲了減小尋址開銷,經過讓一個塊足夠大,從磁盤轉移數據的時間就能遠遠大於定位這個塊開始端的時間.所以,傳送一個由多個塊組成的文件的時間就取決於磁盤傳輸速率.node
Hadoop分佈式文件系統,以流的數據訪問模式來存儲超大文件.運行於商用硬件集羣上,是管理網絡中多臺計算機存儲的文件系統.數據庫
HDFS不適用於要求時間低延遲數據訪問的應用,存儲大量的小文件.多用戶寫入任意修個文件網絡
HDFS數據塊:HDFS上的文件被劃分爲塊大小的多個分塊.做爲獨立的存儲希望,成爲數據塊.默認爲64MB.框架
HDFS的三個節點tcp
Namenode:HDFS的守護進程.用來管理文件系統的命名空間.負責記錄文件是如何分割成數據塊的,以及這些數據庫分別被存儲到那些數據節點上.它的主要功能是對內存及IO進行集中管理分佈式
Datanode:文件系統的工做節點.根據須要存儲和檢索數據塊,而且按期向Namenode發送它們所存儲的塊的列表ide
Secondary Namenode:輔助後臺程序,與Namenode進行通訊,以便按期向namenide發送它們所存儲的塊的列表函數
HDFS Federationoop
經過添加namenode實現他們的擴展,其中每一個name node管理文件系統命名空間中的一部分.每一個name node維護一個命名空間券,包括命名空間的源數據和該命名空間下的文件的全部數據塊的數據塊池.日誌
HDFS HA
在高可用中,配置了一堆活動——備用(active-standby)namenode.當活動namenode失效,備用namenode就會接管它的任務並開始服務與來子客戶端的請求.不會有明顯中斷.
框架的實現包括:namenode之間經過高可用的共享存儲實現編輯日誌的共享;datanode同時向兩個namenode發送數據塊處理報告;客戶端使用特定的機制來處理namenode的失效問題,這一機制對用戶來講是透明的.
故障轉移控制器:管理者將活動namenode轉移給備用namenode的轉換過程基於zookeeper並由此確保有且僅有一個活動namenode,每個namenode運行着一個輕量級的故障控制器,其工做是監督宿主namenode是否失效,並在失效時進行切換.
HDFS讀文件過程
1.客戶端調用FileSystem對象的open()方法在分佈式文件系統中打開要讀的文件
2.分佈式文件系統經過RPC來調用namenode,肯定文件起始塊的位置
3.分佈式文件系統的DistrubtedFileSystem類返回一個支持文件定位的輸入流FSDataInputStream對象.FSDataInputStream封裝DFSInputStream
對象.客戶端對這個輸入流調用read()方法
4.DFSInputStream鏈接距離最近的datanode.反覆調用read連接.尋找下一個塊的最佳data node
5.到達塊的末端時,DSInputStream關閉與該datanode的鏈接,尋找下一塊的最佳data node
6.客戶端完成讀取,對FSDataInputStream調用close()方法關閉鏈接
在讀取時,若客戶端在數據節點通訊時遇到錯誤,那麼它就會去嘗試對這個塊來講最近的下一塊,他會記住那個故障的數據節點以保證不會再對以後的塊進行徒勞無益的嘗試.客戶端也會確認從數據節點發過來的數據的檢驗和.若發現一個損壞的塊,就試圖從別的數據節點中讀取一個塊的副本以前報告給名稱節點
HDFS文件寫入過程
1.客戶端童工DistributedFileSystem對象調用create()函數來建立文件
2.分佈式文件系統對name node建立一個RPC調用,在文件系統的命名空間新建一個文件,建立失敗會返回一個IOException異常
3.Name node對新建文件進行檢查無誤後,分佈式文件系統返回給客戶端一個FSDataInputStream對象.FSDataInputStream對象封裝一個DFSOutputStream對象負責處理name node和data node之間的通訊,客戶端開始寫入數據
4.FSDataOutputStream將數據分紅一個一個數據包,寫入內部隊列「數據隊列」.DataStreamer負責將數據包一次流式傳輸帶由一組name node構成的管線中
5.DFSOutputStream維護着確認隊列來等待data node收到確認回執.收到管道中全部data node確認後,數據包從確認隊列刪除
6.客戶端完成對數據的寫入,對數據流調用close()方法
7.name node確認完成
若在數據寫入期間,數據節點發生故障,此時管線被關閉,確認隊列中的任何包會被添加回數據隊列前面.當前塊的塊在正常工做的數據節點中被賦予一個新的身份並聯系name node.故障節點會從管線中刪除而且餘下塊的數據會被寫入管線中的兩個好的數據節點.名稱節點注意到塊副本不在時,會在另外一個節點上安排建立一個副本.
HDFS一致性
HDFS在保證在寫數據時數據的一致性和持久性,提供了兩個方法hsync()和hflush().hflush()保存flush的數據被新的reader讀到.但不保證被data node持久化.hsync()與hflush()同樣.但hsync()保證數據被data node持久化
DISTCP
distcp能從Hadoop的文件系統並行複製大量數據.通常用於兩個HDFS集羣中傳輸數據.默認狀況下.distcp會跳過目標環境已經有的文件.但能夠經過-overwrite選擇進行覆蓋,也可用-update選項來選擇更新那些修改過的文件.
distcp是做爲一個MapReduce做業執行的.複製工做由集羣中並行運行的map來完成.這裏並無reducer.每一個文件都由一個單一的map進行復制,而且distcp經過將文件分紅大體相等的文件來爲每一個map數量大體相同的數據
HDFS集羣有兩個節點,以管理者——工做者的模式運行.即一個名稱節點(管理者)和多個數據節點(工做者).名稱節點管理文件系統的命名空間,維護着這個文件系統樹以及這個樹內全部的文件和索引目錄.這些信息以兩種形式將文件永久保存在本地磁盤上.命名空間鏡像和編輯日誌.名稱節點也記錄每一個文件的每一個塊所在的數據節點.但它不永久保存塊的位置.數據節點是文件系統的工做者,它們存儲並提供定位塊的服務,而且定時向名稱節點發送它們存儲塊的列表
爲保障名稱節點,Hadoop提供了兩種機制:複製那些組成文件系統元數據持久化的文件.Hadoop能夠經過配置名稱節點在多個文件系統上寫入其持久化狀態,這些寫操做是起同步性和原子性的.通常是在本地磁盤上寫入的同時,寫入一個遠程的NFS掛載;運行一個二級名稱節點,主要做用是按期經過編輯日誌合併命名空間鏡像,以防止編輯日誌過大