首先要了解的是,HDFS采用的是主從架構,即一個主節點(名稱節點),多個從節點(數據節點),主節點起到管家作用,負責提供數據目錄服務,從節點都是數據節點負責數據存儲。
我們都知道文件系統中都是有命名空間的概念的,HDFS也不例外,它的命名空間只有一個,里面包含了目錄、文件、塊,它的使用和傳統的文件體系是一樣的,我們訪問HDFS文件系統,也和傳統的訪問方式一樣通過 / + 目錄名稱訪問。
提到訪問數據,就必須知道HDFS的通信協議。所有的HDFS通信協議都是構建在TCP/IP的基礎之上,而且不同組件之間,通信協議會有些差別,比如,客戶端向名稱節點發起的TCP連接,是使用客戶端的協議和名稱節點進行交互。而整個集群中名稱節點和數據節點之間的交互是使用專門的的數據節點協議進行交互的,另外經常涉及到客戶端讀取數據,就需要客戶端和數據節點進行交互,它通過遠程調用RPC來實現。整個HDFS客戶端實際上就是一個庫,它向外界暴露HDFS文件系統的接口而且還隱藏了后台實現的復雜性,整個操作除了可以通過JAVA API實現,也可以直接通過shell命令實現。
對於分布式文件系統中經常遇到的幾個問題,HDFS給出了如下解決方案:
(1)冗余數據保存的問題:數據以塊為單位,每個塊都被冗余保存,一般一個數據塊被默認保存為三份。這種設計方式的好處:
1)加快數據傳輸速度(若多個客戶端同時訪問,可保證去訪問冗余塊即並行操作);
2)很容易檢查數據錯誤(即通過檢查冗余塊對比數據檢查錯誤);
3)保證數據可靠性(若某機器壞掉仍保證數據可用,且在HDFS中,若副本量低於預設值,系統會自動復制副本達到預設值)
(2)數據保存策略問題:第一個塊來了之后,保存三個副本,第一個副本放在上傳文件的數據節點上(若發送請求不再集群內部,則會隨機挑選一台磁盤不太滿,CPU又不太忙的節點,將第一個副本放在上面),第二個副本會放在和第一個副本不同機架的節點上,第三個副本放在第一個副本相同的機架節點上。這樣的優勢顯而易見,可以保證某個服務器或某個機架出現問題后,其余副本還能正常工作
(3)數據恢復的問題:在數據的存儲中經常會發生數據錯誤,這時候就需要數據恢復策略來恢復數據。HDFS中可能出現數據問題的地方有以下幾種:
1)名稱節點出錯:HDFS 1.0版本通過第二名稱節點進行冷備份,但是這樣的缺點也是顯而易見的,即數據需要一定的時間恢復,在這段時間里,HDFS是無法提供對外服務的。而在HDFS 2.0版本中實現了熱備份,即如果名稱節點出了問題,第二名稱節點會即時頂替名稱節點工作,而不存在數據恢復時間。
2)數據節點出錯:數據節點會定期向名稱節點發送心跳信息(用來告訴名稱節點自己可用),若名稱節點探測到某個數據節點不可用,則將其余數據節點中的備份再復制一份到另一個機器(即隨時保持副本的數量為預設值)
3)數據出現錯誤:客戶端讀取數據后會對它的數據進行校驗碼驗證(每個文件都有一個校驗碼),如果發現校驗碼不對,就說明數據除了問題,校驗碼是在文件被創建的時候生成的,即客戶端每寫入一個文件都會為該數據塊生成一個校驗碼,把它保存在同一文件目錄下,下次讀取的時候會連帶校驗碼一起讀取,讀到之后進行計算,把計算得到的校驗碼和上次生成的校驗碼進行比較,如果不一致,說明數據存儲過程中發生了錯誤,然后對錯誤數據進行恢復和復制。