Hadoop(四)HDFS集羣詳解

前言node

  前面幾篇簡單介紹了什麼是大數據和Hadoop,也說了怎麼搭建最簡單的僞分佈式和全分佈式的hadoop集羣。接下來這篇我詳細的分享一下HDFS。linux

  HDFS前言:shell

    設計思想:(分而治之)將大文件、大批量文件,分佈式存放在大量服務器上,以便於採起分而治之的方式對海量數據進行運算分析。安全

    在大數據系統中做用:爲各種分佈式運算框架(如:mapreduce,spark,tez,……)提供數據存儲服務服務器

  分佈式文件系統:網絡

    問題引起:海量數據超過了單臺物理計算機的存儲能力架構

    解決方案:對數據分區存儲與若干臺物理主機中框架

    分佈式文件系統應運而生:分佈式

            1)管理網絡中跨多臺計算機存儲的文件系統工具

            2)HDFS就是這樣的一個分佈式文件系統

1、HDFS概述

1.一、HDFS概述

  1)HDFS集羣分爲兩大角色:NameNode、DataNode
  2)NameNode負責管理整個文件系統的元數據
  3)DataNode負責管理用戶的文件數據塊
  4)文件會按照固定的大小(blocksize)切成若干塊後分布式存儲在若干臺datanode上
  5)每個文件塊能夠有多個副本,並存放在不一樣的datanode上 
  6)DataNode會按期向NameNode彙報自身保存的block信息,而namenode則會負責保持文件的副本數量
  7)HDFS的內部工做機制對客戶端保持透明,客戶端請求訪問HDFS都是經過namenode申請來進行

1.二、HDFS的概念和特性

  1)HDFS的概念  

     HDFS採用了主從式(Master/Slave)的體系結構,其中NameNode(NN),DataNode(DN)和Client是HDFS中的3個重要角色。HDFS也在社區的努力下不斷演進,包括支持文件追加,Federation,HA的引入等。

    在一個HDFS中,有一個NN,一個SNN(Secondary NameNode)和衆多的DN,在大型的集羣中可能會有數以千計的DN。而Client,通常意義上比數據節點的個數還要多。  

    NN管理了HDFS兩個最重要的關係:
      1)目錄文件樹結構和文件與數據塊的對應關係:會持久化到物理存儲中,文件名叫作fsimage。
      2)DN與數據塊的對應關係,即數據塊存儲在哪些DN中:在DN啓動時會上報到NN它所維護的數據塊。這個是動態創建的,不會持久化。所以,集羣的啓動可能須要比較長的時間。
    而DN則保存了數據塊。而且執行NN的命令,好比複製,拷貝,刪除等操做。Client則是使用HDFS的主題,包括寫文件,讀文件等常見操做。

    總的來講:HDFS是一個文件系統,用於存儲文件,經過統一的命名空間——目錄樹來定位文件。其次,它是分佈式的,由不少服務器聯合起來實現其功能,集羣中的服務器有各自的角色

  2)HDFS的特性

    2.1)HDFS中的文件在物理上是分塊存儲(Block),塊的大小能夠經過配置參數(dfs.blocksize)來規定 默認大小在hadoop2.x版本中是128M,老版本中的64M 
    2.2)HDFS文件系統會給客戶端提供一個統一的抽象目錄樹,客戶端經過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data 
    2.3)目錄結構及文件分塊信息(元數據)的管理由namenode節點承擔 namenode是HDFS集羣主節點,負責維護整個HDFS文件系統的目錄樹以及每個路徑(文件)對應的block塊信息(block的id,以及所在的datanode服務器)   
    2.4)文件的各個block的存儲管理由datanode節點承擔 datanode是HDFS集羣從節點,每個block均可以在多個datanode上存儲多個副本(副本參數也能夠經過參數設置dfs.replication)  
    2.5)HDFS適應一次寫入,屢次讀出的場景,且不支持文件的修改。

    注意:適合用來作數據分析,並不適合用來作網盤應用(由於不方便進行修改,延遲大,網絡開銷大,成本過高)    

  3)咱們經過一張圖來解釋

    經過上面的描述咱們知道,hdfs不少特色:

      保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復(默認存3份)。

      運行在廉價的機器上

      適合大數據的處理。HDFS默認會將文件分割成block,,在hadoop2.x以上版本默認128M爲1個block。而後將block按鍵值對存儲在HDFS上,並將鍵值對的映射存到內存中。若是小文件太多,那內存的負擔會很重。

       

    如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。
    NameNode:是Master節點,是大領導。管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;
    SecondaryNameNode:是一個小弟,分擔大哥namenode的工做量;是NameNode的冷備份;合併fsimage和fsedits而後再發給namenode。
    DataNode:Slave節點,奴隸,幹活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操做。
    熱備份:b是a的熱備份,若是a壞掉。那麼b立刻運行代替a的工做。
    冷備份:b是a的冷備份,若是a壞掉。那麼b不能立刻代替a工做。可是b上存儲a的一些信息,減小a壞掉以後的損失。
    fsimage:元數據鏡像文件(文件系統的目錄樹。)
    edits:元數據的操做日誌(針對文件系統作的修改操做記錄)
    namenode內存中存儲的是=fsimage+edits。
    SecondaryNameNode負責定時默認1小時,從namenode上,獲取fsimage和edits來進行合併,而後再發送給namenode。減小namenode的工做量。

1.三、HDFS的侷限性

  1)低延時數據訪問。在用戶交互性的應用中,應用須要在ms或者幾個s的時間內獲得響應。因爲HDFS爲高吞吐率作了設計,也所以犧牲了快速響應。對於低延時的應用,能夠考慮使用HBase或者Cassandra。
  2)大量的小文件。標準的HDFS數據塊的大小是64M,存儲小文件並不會浪費實際的存儲空間,可是無疑會增長了在NameNode上的元數據,大量的小文件會影響整個集羣的性能。

    前面咱們知道,Btrfs爲小文件作了優化-inline file,對於小文件有很好的空間優化和訪問時間優化。
  3)多用戶寫入,修改文件。HDFS的文件只能有一個寫入者,並且寫操做只能在文件結尾以追加的方式進行。它不支持多個寫入者,也不支持在文件寫入後,對文件的任意位置的修改。
    可是在大數據領域,分析的是已經存在的數據,這些數據一旦產生就不會修改,所以,HDFS的這些特性和設計侷限也就很容易理解了。HDFS爲大數據領域的數據分析,提供了很是重要並且十分基礎的文件存儲功能

1.四、HDFS保證可靠性的措施

  1)冗餘備份

    每一個文件存儲成一系列數據塊(Block)。爲了容錯,文件的全部數據塊都會有副本(副本數量即複製因子,課配置)(dfs.replication)

  2)副本存放

    採用機架感知(Rak-aware)的策略來改進數據的可靠性、高可用和網絡帶寬的利用率

  3)心跳檢測

    NameNode週期性地從集羣中的每個DataNode接受心跳包和塊報告,收到心跳包說明該DataNode工做正常

  4)安全模式

    系統啓動時,NameNode會進入一個安全模式。此時不會出現數據塊的寫操做。

  5)數據完整性檢測

    HDFS客戶端軟件實現了對HDFS文件內容的校驗和(Checksum)檢查(dfs.bytes-per-checksum)。 

2、HDFS基本概念

2.一、HDFS主從結構體系

  

2.二、數據塊(DataBlock)

  HDFS將每一個文件存儲成一系列的數據塊,全部的數據塊都是一樣的大小。(在配置文件中配置每一個數據塊的大小,最後一塊不必定大小同樣)

  文件中全部的數據塊都會有副本,每一個文件的數據塊大小和副本系數都是可配置的。

  HDFS中的文件都是一次寫入的,而且嚴格要求在任什麼時候候只能有一個寫入者。 

  咱們能夠查看到經過:hdfs  fsck / -file -bloks  -locations

  HDFS的配置參數:dfs.replication、dfs.blocksize

  

2.三、名字節點(主節點:NameNode)

  1)概述

    -NN是HDFS主從結構中主節點上運行的主要進程,它負責管理從節點DN。NN維護着整個文件系統的文件目錄樹,文件目錄的元信息和文件的數據塊索引。

         這些信息以兩種信息保存在本文文件系統中,一種是文件系統鏡像(文件名字fsimage),另外一種是fsimage的編輯日誌(文件名字edits)。

    -fsimage中保存着某一特定時刻HDFS的目錄樹、元信息和文件數據塊的索引等信息後續的對這些信息的改動,則保存在編輯日誌中,它們一塊兒提供了一個完整的NN的第一關係

    -經過NN,Client還能夠瞭解到數據塊所在的DN的信息。須要注意的是,NN中關於DN的信息是不會保存到NN的本地文件系統的,也就是上面提到的fsimage和edits中。

      NN每次啓動時,都會經過每一個DN的上報來動態的創建這些信息。這些信息也就構成了NN第二關係。

    -NN還能經過DN獲取HDFS總體運行狀態的一些信息,好比系統的可用空間,已經使用的空間,各個DN的當前狀態等。

  2)做用

  維護着文件系統數中全部文件和目錄的元數據

  協調客戶端對文件的訪問

    

2.四、數據節點(從節點:DataNode)

  1)概述

     DN是HDFS中硬盤IO最忙碌的部分:將HDFS的數據塊寫到Linux本地文件系統中,或者從這些數據塊中讀取數據。DN做爲從節點,會不斷的向NN發送心跳。

    初始化時,每一個DN將當前節點的數據塊上報給NN。NN也會接收來自NN的指令,好比建立、移動或者刪除本地的數據塊,而且將本地的更新上報給NN。

  2)做用

    接受客戶端或NameNode的調度

    存儲和檢索數據塊

    在NameNode的統一調度下進行數據塊的建立、刪除和複製

    按期向NameNode發送自身存儲的數據塊列表

2.五、SecondaryNameNode

  1)按期合併edits和fsImage(若是沒有配置SecondaryNameNode由NameNode本身完成)

     Secondary NameNode是用於按期合併fsimage和edits的。與NN同樣,每一個集羣都有一個SNN,在大規模部署的條件下,通常SNN也獨自佔用一臺服務器。

    SNN按照集羣配置的時間建個,不停的獲取HDFS某一個時間點的fsimage和edits,合併它們獲得一個新的fsimage。該fsimage上傳到NN後會替換NN的老的fsimage。

  2)防止edits日誌文件過大

    從上面能夠看出,SNN會配合NN,爲NN的第一關係提供了一個簡單的CheckPoint機制,並避免出現edits過大,致使NN啓動時間過長的問題。

  3)提供那個NameNode的fsImage文件的檢查點,以實現NameNode故障恢復

    

2.六、總結NameNode和DataNode

  -HDFS集羣有兩種節點類型,Namenodes和Datanodes,它們工做於master-worker模式。一個namenode是master,一組datanodes是workers。namenode管理整個文件系統的namespace。
     它維護一棵文件樹和全部文件/目錄的元信息。這些信息在namenode的本地磁盤上存成兩個文件,一個是該namespace的鏡像,另外一個是編輯日誌(edit log)
     namenode也知道每一個文件的每一個塊都存在哪一個datanode上了,但這個信息不會被持久化下來,由於每次啓動時,這個信息會被從新生成。
  -客戶端程序經過訪問namenode和datanodes來訪問HDFS文件系統。可是用戶代碼根本不知道namenode和datanodes的存在,就像訪問POSIX同樣(Portable Operating System Interface:便攜計算機系統接口)。
     Datanodes是幹苦力活的。當被客戶端或namenode命令時,它存儲和檢索文件塊(blocks)。它還會按期向namenode彙報它們存儲的文件塊列表。
  -沒有namenode,整個文件系統就無法用了。若是把namenode移除,整個文件系統裏的文件就都丟失了,由於沒辦法知道如何從新組裝存在各個datanodes裏的文件塊。
     所以有必要保證namenode足夠可靠,Hadoop提供了兩種機制保證namenode裏的數據安全。
  -第一個機制是備份namenode上的持久化信息。能夠配置hadoop,讓namenode寫持久化信息時寫到多個地方,而且這些寫操做是串行的而且是原子操做。一般的作法是寫到本地磁盤一份,同時寫到遠程NFS上。
  -另外一個機制是配一個secondary namenode。雖然名字上叫namenode,但secondary namenode根本不作namenode的工做,它就是按期把namenode上的namespace鏡像和編輯日誌(edit log)合併到本身身上,以免編輯日誌過大。
     secondary namenode一般是一臺單獨的機器,由於合併工做須要大量的CPU和內存資源。由於它的狀態遲於namenode,因此,當namenode發生事故時,確定是會有數據丟失的。
     一般的作法是把namenode在NFS上的metadata文件拷貝到secondary namenode,而後啓動這個secondary namenode,讓它成爲namenode。

4、單點故障(單點失效)問題

4.一、單點故障問題

  若是NameNode失效,那麼客戶端或MapReduce做業均沒法讀寫查看文件

4.二、解決方案

  1)啓動一個擁有文件系統元數據的新NameNode(這個通常不採用,由於複製元數據很是耗時間)

  2)配置一對活動-備用(Active-Sandby)NameNode,活動NameNode失效時,備用NameNode當即接管,用戶不會有明顯中斷感受。

    共享編輯日誌文件(藉助NFS、zookeeper等)

    DataNode同時向兩個NameNode彙報數據塊信息

    客戶端採用特定機制處理 NameNode失效問題,該機制對用戶透明

5、細說HDFS高可用性(HA:High-Availability)

1)前面在(2. Namenodes和Datanodes)提到的經過備份namenode上的持久化信息,或者經過secondary namenode的方式,只能解決數據不丟失,可是不能提供HA(高可用性),

  namenode仍然是「單點失敗」(SPOF:single point of failure)。若是namenode死掉了,全部的客戶端都不能訪問HDFS文件系統裏的文件了,不能讀寫也不能列出文件列表。

2)新的namenode必須作下面三件事才能再次提供服務:
  i) 加載namespace鏡像
  ii) 重作編輯日誌(edit log)裏的操做
  iii) 接收全部datanodes上的文件塊信息彙報,退出安全模式
  對於一個大型集羣來說,一次這樣的冷啓動可能要花費30分鐘的時間。
  在Hadoop 2.x版本中引入了active-standby模式的一對namenodes。當災難發生時,standby的機器會取代active的機器,成爲新的namenode。爲了實現這樣的結構,須要新的架構:
    - 兩個namenodes之間要有一塊共享的存儲空間,以便共享編輯日誌(edit log)。早期實現須要一個高可用的NFS,在後來的版本中有更多的選擇,例如可使用ZooKeeper解決方案。
    - 另外,由於文件塊的映射關係是存在內存裏的,不是存在磁盤上的,所以datanodes必須向兩個namenodes同時彙報本身的存儲狀況。
    - 客戶端須要配置成可以自動處理namenode失敗的狀況,對使用者透明。
 
3)當active namenode死掉了,standby namenode替換上去的時間很快,也就是幾十秒的樣子。由於standby namenode上有最新的文件塊映射信息和最新的編輯日誌(edit log),一切都是時刻準備着的。
    可是肯定active namenode是否是真的死了是個大麻煩,會花費更長時間(大概一分鐘左右)。
4)若是active namenode和standby namenode都死了怎麼辦?不要緊,就花30分鐘冷啓動一下就行了,跟沒有active-standby同樣,不會更壞。所以,active-standby是一個改進性的優化,不會帶來反作用。
 
5)判斷active是否是還活着,其實就是用心跳請求的方式的。可是,管理員還有另一個工具能夠在active還活着的狀況下,優雅地切換到standby上,讓standby成爲新的active,
  這在按期維護的狀況下很是有用。這種切換之因此被稱爲「優雅失敗」(graceful failover),由於兩個namenodes會按順序切換角色,一個成爲active,一個變成standby。
6)在不優雅的切換中,就是active死掉了,不得已換成了standby來服務,這時,原來的active不必定真的死了,多是網絡慢啊或者什麼緣由,致使它後來又能提供服務了,
  最麻煩的是它本身不知道本身曾經死了,它要是再冒出來服務就麻煩了,所以,有一系列的動做會阻止它再次加入系統,好比殺掉進程啊,關閉端口啊什麼的,最後一招就是STONITH(暴頭:shoot the other node in the head)。
 
7)全部這些都是對客戶端透明的。客戶端配置namenode時是把一個hostname映射到兩個IP上的,而後分別試兩個IP,哪一個通就用哪一個。

6、HDFS的shell(命令行客戶端)操做

  注意在Hadoop2.0以前是使用的hadoop命令,那時候的HDFS集羣叫作hadoop集羣,可是hadoop2.0以後。使用的是hdfs命令,hadoop集羣也分爲了HDFS集羣和Yarn集羣!

6.一、HDFS的shell操做

  1)查看命令幫助:hdfs -help
    

  2)運行一個文件系統命令在Hadoop集羣支持的文件系統中

    

6.二、HDFS  DFS命令詳解  

1)、準備工做

  檢查須要處理的數據(假定數據已經存放在hdfs的/user/hadoop⽬錄下)
    $> hadoop fs -ls /user/hadoop
  看到測試數據⽬錄weather_test,完整數據⽬錄weather,專利數據⽬錄patent便可,若沒有則請從服務器下載並上傳⾃⼰的⽬錄下

2)、文件操做

  1)建⽴⽬錄(在hdfs的/user/xxx⽬錄下操做)
    $> hdfs dfs -mkdir input

    

  2)查看⽂件或⽬錄
    $> hdfs dfs -ls

    

  3)⽂件上傳(將本地⽂件local_file上傳到hdfs的/user/xxx⽬錄下)
    $> hdfs dfs -put local_file input
  4)下載⽂件或⽬錄到本地當前⽬錄下
    $> hdfs dfs -get input .
  5)瀏覽hdfs中的⽂件
    $> hdfs dfs -cat input/local_file
  6)刪除⽂件或者⽬錄
    $> hdfs dfs -rm input/local_file
  7)在hdfs中複製⽂件或⽬錄
    $> hdfs dfs -cp input/local_file input/local_file.bak

  8)修改權限

    

  9)查看命令幫助
    $> hdfs dfs -help [cmd]

6.三、HDFS管理命令

  1)系統⽬錄檢查
    $> hdfs fsck /user/xxx系統⽬錄詳細檢測
    $> hdfs fsck /user/xxx -files -blocks -locations -racks
  2)檢測DataNode報告
    $> hdfs dfsadmin -report
  3)權限管理
    $> hdfs fs -chmod 666 /user/xxx
  4)hdfs空間⽬錄配額設置
    $> hdfs dfsadmin -setSpaceQuota [N] /user/xxx
  5)hdfs空間⽬錄配額清除
    $> hdfs dfsadmin -clrSpaceQuota /user/xxx
  6)查看⽬錄配額設置
    $> hdfs fs -count -q /user/xxx
  7)刪除DataNode
    $> hdfs dfsadmin -refreshNodes

總結:

  注意HDFS中的文件系統也是和linux文件系統同樣的。既然是文件系統也有根目錄和家目錄,在HDFS中「/」表明的就是根目錄,而「/user」等於linux中的「/usr」下一級目錄表明的就是用戶了。

  可是HDFS沒有這個用戶,因此就有了虛擬用戶,也就是你當前HDFS的Linux系統當前用戶就會默認爲它的虛擬用戶。當咱們有一個zyh用戶時,因此你就能夠建立一個/user/zyh/下面的目錄,就表明着家目錄。

 

喜歡就點個「推薦」哦!

相關文章
相關標籤/搜索