HDFS的shell命令
既然是一個文件系統,它有對文件的基本操作(類似linux裏面的cp、mv、ls等)
調用方式:把hadoop裏面的bin添加到環境變量
hadoop fs -ls / #查看HDFS的根目錄
hadoop fs -mkdir /test #在根目錄下建立test文件夾
hadoop fs -put ./xx #上傳
hadoop fs -get /test/test.txt #下載
。。。
HDFS的架構
- NameNode
- DataNode
- Secondary NameNode
例子:上傳一個文件的過程
- 客戶端請求上傳一個文件(請求NameNode)
- NameNode會分配哪幾個DataNode給客戶端,NameNode裏面記錄元數據(文件分成幾個block,每個block在那個DataNode上)
- 客戶端將文件上傳到DataNode上
(1)上傳block1,上傳完了之後到block2,再到block3,如果完成了,接下來的過程跟客戶端無關了
(2)同時當block1上傳完之後,由block1上傳副本到另一個DataNode,再由副本上傳另一個副本到另一個DataNode
(3)如果第三個副本由第二個傳輸的時候失敗了,第二個響應第一個,第一個響應NameNode,NameNode知道第三個副本上傳失敗,會重新再分配一個DataNode,由第一或者第二個中任意一個再去上傳
NameNode如何管理元數據
- 客戶端請求寫數據,NN(NameNode)會分配DataNode,這些數據會先在edits_log(很小,做緩存用)裏面保存爲日誌
- 當客戶端寫完之後,給NN響應,NN將日誌以元數據的形式讀到內存裏(方便查詢速度、實時響應多個客戶端)
- 等到edits_log滿了之後,它會和fsimage(存在硬盤的元數據,和內存中是同步的)進行合併,需要藉助Secondary NameNode(因爲這個過程需要將log數據轉到元數據的格式,需要計算時間),合併過程如下:
註釋:Checkpoint:合併操作
- 元數據的存儲格式
- /test/a.log : HDFS的虛擬路徑
- 3 :副本數
- {blk_1, blk_2}:幾個block
- [{blk_1:[h0,h1,h3]}]:blk_1三個副本在哪幾個DataNode主機上(h0,h1,h3)
NameNode的職責
- 管理元數據
- 維護HDFS的目錄
- 響應客戶端的請求