HDFS相關

HDFS(Hadoop Distributed File System ) 是Hadoop 項目的核心子項目,是分佈式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文件而開發的,能夠運行於廉價商用服務器上。它具備高容錯、高可靠性、高可擴展性、搞得到性、高吞吐率等特徵爲海量數據提供了不怕故障的存儲,爲超大數據集(Large Data Set)的應用處理帶來了不少便利。node

原理
  • 存儲方式:服務器

    • HDFS採用 Master/Slave 的架構來存儲數據,這種架構主要由四個部分組成:HDFS Client、NameNode、DataNode和 Secondary NameNode
    • Client:
      • 文件切分。文件上傳HDFS的時候,Client將文件切分紅一個一個的Block,而後進行存儲。
      • 與NameNode交互,獲取文件的位置信息。
      • 與DataNode交互,讀取或寫入數據。
      • Client提供一些命令來管理HDFS,好比啓動或者關閉HDFS。
      • Client能夠經過命令來訪問HDFS。
    • NameNode:就是master,是一個主管、管理者
      • 管理HDFS的名稱空間
      • 管理數據塊(Block)映射信息
      • 配置副本策略
      • 處理客戶端讀寫請求
    • DataNode:就是Slave。NameNode下達命令,Data執行實際的操做。
      • 存儲實際的數據塊。
      • 執行數據塊的讀/寫操做。
    • Sencondary NameNode:並不是NameNode熱備。當NameNode掛掉的時候,它並不能立刻替換 NameNode 並提供服務。
      • 輔助NameNode,分擔其工做量。
      • 按期合併 fsimage和fsedits,並推送給NameNode。
      • 在緊急狀況下,可輔助恢復NameNode。
  • 圖片架構

  • 優勢:併發

    • 高容錯:
      • 數據自動保存多個副本,經過增長副本的形式,提升容錯性。
      • 某個副本丟失後,它能夠自動恢復。
    • 適合批處理:
      • 處理數據達到 GB、TB、PB級別
      • 處理百萬規模以上的文件數量,數量至關之大
      • 處理10K節點的規模。
    • 流式文件訪問:
      • 一次寫入,屢次讀取。文件一旦寫入不能修改們只能追加。
      • 保證數據的一致性
    • 可構建在廉價機器上:
      • 經過多副本機制,提升可靠性
      • 提供了容錯和恢復機制。好比某一副本丟失,能夠經過其它副原本恢復。
  • 缺點:app

    • 作不到低延時數據訪問:
      • 好比毫秒級訪問數據
      • 適合高吞吐率的場景,就是在某一時間內寫入大量的數據。
    • 小文件存儲:
      • 存儲大量小文件(這裏的小文件是指小於HDFS系統的Block大小的文件默認64M)的話,它會佔用NameNode大量的內存來存儲文件、目錄和快信息。這樣是不可取的,由於NameNode的內存老是有限的。
      • 小文件存儲的尋道時間會超過讀取時間,它違反了HDFS的設計目標。
    • 併發寫入、文件隨機修改
      • 一個文件只能有一個寫,不容許多個線程同時寫。
      • 僅支持數據append(追加),不支持文件的隨機修改。
讀寫操做:
  • 讀操做
    • Client調用FileSystem對象的open()方法,獲取一個DistributedFileSystem實例。
    • DistributedFileSystem 經過RPC(遠程過程調用)獲取文件的第一批block的locations,同一Block安裝重複數會返回多個locations,這些locations安裝Hadoop拓撲結構排序,舉例客戶端近的牌子前面。
    • 前兩步會返回一個 FSDataInputStream對象,該對象被封裝成DFSInputStream對象,DFSInputStream能夠方便的管理 datanode和 namenode數據流。
      • 客戶端調用read方法,DFSInputStream就會找出力客戶端最近的datanode並鏈接datanode。
    • 數據從datanode流向客戶端。
    • 若是一個block的數據讀完了,就會關閉指向第一個block塊的datanode鏈接,接着讀取下一個block塊。(這些操做對客服端來講是透明的,從客戶端的解讀來看只是讀一個持續不端的流)
    • 若是第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的locations,而後繼續讀。
    • 讀完全部block塊,關閉流。

輸入圖片說明

  • 寫操做
    • 客服端經過調用 DistributedFileSystem 的create()方法,建立一個新的文件。
    • DistributedFileSystem經過 RPC(遠程過程調用)調用NameNode,去建立一個沒有blocks關聯的新文件。
      • 建立前,NameNode會作各類校驗,好比文件是否存在,客戶端有無關係去建立等。
      • 若是校驗經過,NameNode就會記錄下新文件,不然就會拋出IO異常。
    • 前兩步結束後返回 FSDataOutPutStream 的對象,而後被封裝成DFSOutputStream,DFSOutPutStream能夠協調 NameNode和DataNode。
      • 客戶端開始寫數據到 DFSOutputStream,DFSOutputStream 會把數據切成一個一個小packet,而後排成隊列 data queue。
    • DataStreamer 會接受data queue
      • 它先詢問NameNode這個新的block 最合適存儲在哪幾個DataNode裏,好比重複數是3,那麼就找到3個最合適的DataNode,把它們排成一個Pipeline。DataStreamer 把packet 按隊列輸出到管道的第一個DataNode中,第一個DataNode又把packet輸出到第二個DataNode中,以此類推。
    • DFSOutPutStrem 還有個隊列叫 ack queue,也是由 packet組成,等待DataNode的收到響應,當pipeline中的全部DataNode都表示已經收到的時候,這時 ack queue纔會把對應的packet包移除掉。
    • 客戶端完成寫數據後,調用close方法並關閉寫入流。
    • DataStreamer 把剩餘的包都刷到pipeline裏,而後等待ack信息,收到最後一個ack後,通知DataNode把文件標識爲已完成。

輸入圖片說明

  • HDFS的副本策略

輸入圖片說明

安裝
命令
'hadoop fs'
    hadoop fs -ls /
    hadoop fs -lsr
    hadoop fs -mkdir /user/hadoop
    hadoop fs -put a.txt /user/hadoop/
    hadoop fs -get /user/hadoop/a.txt /
    hadoop fs -cp src dst
    hadoop fs -mv src dst
    hadoop fs -cat /user/hadoop/a.txt
    hadoop fs -rm /user/hadoop/a.txt
    hadoop fs -rmr /user/hadoop/a.txt
    hadoop fs -text /user/hadoop/a.txt
    hadoop fs -copyFromLocal localsrc dst 與hadoop fs -put功能相似。
    hadoop fs -moveFromLocal localsrc dst 將本地文件上傳到hdfs,同時刪除本地文件。
"hadoop fsadmin"
    hadoop dfsadmin -report
    hadoop dfsadmin -safemode enter | leave | get | wait
    hadoop dfsadmin -setBalancerBandwidth 1000
"hadoop fsck"
"start-balancer.sh"
相關文章
相關標籤/搜索