1.1 HDFS的介紹
源自於Google的GFS論文 發表於2003年10月 HDFS是GFS克隆版 ,HDFS的全稱是Hadoop Distributed File System易於擴展的分佈式文件系統,運行在大量普通廉價機器上,提供容錯機制,爲大量用戶提供性能不錯的文件存取服務 。
1.2 HDFS設計目標
-
自動快速檢測應對硬件錯誤
-
流式訪問數據
-
移動計算比移動數據本身更划算
-
簡單一致性模型
-
異構平臺可移植
1.3 HDFS的特點
優點:
-
高可靠性:Hadoop按位存儲和處理數據的能力值得人們信賴;
-
高擴展性:Hadoop是在可用的計算機集簇間分配數據並完成計算任務的,這些集簇可以方便地擴展到數以千計的節點中。
-
高效性:Hadoop能夠在節點之間動態地移動數據,並保證各個節點的動態平衡,因此處理速度非常快。
-
高容錯性:Hadoop能夠自動保存數據的多個副本,並且能夠自動將失敗的任務重新分配。
缺點:
-
不適合低延遲數據訪問。
-
無法高效存儲大量小文件。
-
不支持多用戶寫入及任意修改文件。
1.4 hdfs核心設計思想及作用
-
分而治之:將大文件、大批量文件,分佈式存放在大量服務器上,以便於採取分而治之的方式對海量數據進行運算分析;
-
爲各類分佈式運算框架(如:mapreduce,spark,tez,……)提供數據存儲服務
-
hdfs更具體描述
首先,它是一個文件系統,用於存儲文件,通過統一的命名空間——目錄樹來定位文件
其次,它是分佈式的,由很多服務器聯合起來實現其功能,集羣中的服務器有各自的角色;
1.5 重要特性如下:
-
HDFS中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數( dfs.blocksize)來規定,默認大小在hadoop2.x版本中是128M,老版本中是64M。
-
HDFS文件系統會給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
-
目錄結構及文件分塊信息(元數據)的管理由namenode節點承擔——namenode是HDFS集羣主節點,負責維護整個hdfs文件系統的目錄樹,以及每一個路徑(文件)所對應的block塊信息(block的id,及所在的datanode服務器)。
-
文件的各個block的存儲管理由datanode節點承擔--- datanode是HDFS集羣從節點,每一個block都可以在多個datanode上存儲多個副本(副本數量也可以通過參數設置dfs.replication)。
HDFS概述
-
HDFS集羣分爲兩大角色:NameNode、DataNode
-
集羣中主機分別放置在不同的機架中
-
NameNode負責管理整個文件系統的元數據metadata
-
DataNode 負責管理用戶的文件數據塊block
-
文件會按照固定的大小(blocksize)切成若干塊後分布式存儲在若干臺datanode上
-
每一個文件塊可以有多個副本,並存放在不同的datanode上
-
Datanode會定期向Namenode彙報自身所保存的文件block信息,而namenode則會負責保持文件的副本數量
-
HDFS的內部工作機制對客戶端保持透明,客戶端請求訪問HDFS都是通過向namenode申請來進行
1.讀取過程分析
-
客戶端或者用戶通過調用 FileSystem 對象的 open()方法打開需要讀取的文件,這對 HDFS 來說是常見一個分佈式文件系統的一個讀取實例。
-
FileSystem 通過遠程協議調用 NameNode 確定文件的前幾個 Block 的位置。對於每一個 Block, NameNode 返回一含有那個 Block 拷貝的“元數據”,即文件基本信息;接下來,DataNode 按照上文定義的距離值進行排序,如果 Client 本身就是一個 DataNode,那麼優先從本地 DataNode 節點讀取數據。 HDFS 實例做完以上工作後,返回一個 FSDataInputStream給客戶端,讓其從 FSDataInputStream 中讀取數據。 FSDataInputStream 接着包裝一個DFSInputStream,用來管理 DataNode 和 NameNode 的 I/O。
-
NameNode 向客戶端返回一個包含數據信息的地址,客戶端根據地址創建一個FSDataInputStream 開始對數據進行讀取。
-
FSDataInputStream 根據開始時存放的前幾個 Blocks 的 DataNode 的地址,連接到最近的 DataNode 上對數據開始從頭讀取。客戶端反覆調用 read()方法,以流式方式從DataNode 讀取數據。
-
當讀到 Block 的結尾的時候, FSDataInputStream 會關閉到當前 DataNode 的鏈接,然後查找能夠讀取下一個 Block 的最好的 DataNode。這些操作對客戶端是透明的,客戶端感覺到的是連續的流,也就說讀取的時候就開始查找下一個塊所在的地址。
-
-
讀取完成調用 close()方法,關閉 FSDataInputStream。
以上就是 HDFS 對數據進行讀取的整個流程。
-
2.寫入過程分析
-
Client 通過調用 FileSystem 的 create()方法來請求創建文件
-
FileSystem 通過對 NameNode 發出遠程請求,在 NameNode 裏面創建一個新的文件,但此時並不關聯任何的塊。 NameNode 進行很多檢查來保證不存在要創建的文件已經存在於文件系統中,同時檢查是否有相應的權限來創建文件。如果這些檢查都完成了,那麼NameNode 將記錄下來這個新文件的信息。 FileSystem 返回一個 FSDataOutputStream 給客戶端用來寫入數據。和讀的情形一樣, FSDataOutputStream 將包裝一個 DFSOutputStream 用於和 DataNode 及 NameNode 通信。而一旦文件創建失敗,客戶端會收到一個 IOExpection,標示文件創建失敗,停止後續任務。
-
客戶端開始寫數據。 FSDataOutputStream 把要寫入的數據分成包的形式,將其寫入到中間隊列中。其中的數據由 DataStreamer 來讀取。 DataStreamer 的職責是讓 NameNode分配新的塊——通過找出合適的 DataNode——來存儲作爲備份而複製的數據。這些DataNode 組成一個流水線,我們假設這個流水線是個三級流水線,那麼裏面將含有三個節點。此時, DataStreamer 將數據首先寫入到流水線中的第一個節點。此後由第一個節點將數據包傳送並寫入到第二個節點,然後第二個將數據包傳送並寫入到第三個節點。
-
FSDataOutputStream 維護了一個內部關於 packets 的隊列,裏面存放等待被DataNode 確認無誤的 packets 的信息。這個隊列稱爲等待隊列。一個 packet 的信息被移出本隊列當且僅當 packet 被流水線中的所有節點都確認無誤
-
當完成數據寫入之後客戶端調用流的 close 方法,在通知 NameNode 完成寫入之前,這個方法將 flush 殘留的 packets,並等待確認信息( acknowledgement)。 NameNode 已經知道文件由哪些塊組成(通過 DataStream 詢問數據塊的分配),所以它在返回成功前只需要等待數據塊進行最小值複製。
3.文件訪問權限
-
只讀權限 -r :最基本的文件權限設置,應用於所有可進入系統的用戶,任意一個用戶讀取文件或列出目錄內容時只需要只讀權限。
-
寫入權限 -w :用戶使用命令行或者 API 接口對文件或文件目錄進行生成以及刪除等操作的時候需要寫入權限。
-
讀寫權限 -rw :同時具備上述兩種權限功能的一種更加高級的權限設置。
-
執行權限 -x :一種特殊的文件設置, HDFS 目前沒有可執行文件,因此一般不對此進行設置,但是可將此權限用於對某個目錄的權限設置以對用戶羣加以區分。
4. Hadoop 靜態和動態增加刪除節點
-
靜態添加,關閉hadoop集羣,配置相應配置,重啓集羣
-
修改slave文件 重啓hadoop集羣
優點:改動少
缺點:暴力 需要停止服務
應用環境:晚上或凌晨做 不耽誤使用
檢查:50070和8088 端口檢查
-
-
動態添加,在不重啓集羣的情況下添加節點
-
設置新節點與NN和RM的SSH無密碼登陸
-
在hosts添加主機名稱,並且把該文件複製到集羣中的其他節點上
-
修改主節點上的slaves文件(主要用於下次重啓的時候使用)
[ ] 在新節點中啓動進程:可以單獨起 就不需要一起起服務了
sbin/hadoop-daemon.sh start datanode sbin/yarn-daemon.sh start nodemanager
優點:非暴力 不需要停止服務
缺點:改動多 如果一次上很多 會亂
應用環境:隨時不耽誤使用
檢查:50070和8088 端口檢查
-