HDFS是一個文件系統,用於存儲文件,通過統一的命名空間--目錄樹來定位文件;其次,它是分佈式的,由很多服務器聯合起來實現其功能,集群中的服務器有各自的角色。
HDFS設計思想:分而治之:將大文件、大批量文件,分佈式存放在大量服務器上,以便於採取分而治之的方式對海量數據進行運算分析。
在大數據系統中作用:為各類分佈式運算框架(如:mapreduce,spark,tez,....)提供數據存儲服務。
重點概念:文件切塊,副本存放,元數據。
HDFS重要特性:
- HDFS中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數(dfs.blocksize)來規定,默認大小在hadoop2.x版本中是128M,老版本中是64M;
- HDFS文件系統會給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/file.data;
- 目錄結構及文件分塊信息(元數據)的管理由namenode節點承擔-------namenode是HDFS集群主節點,負責維護整個hdfs文件系統的目錄樹,以及每一個路徑(文件)所對應的block塊信息(block的id。及所在的datanode服務器);
- 文件的各個block的存儲管理由datanode節點承擔-----------namenode是HDFS集群從節點,每一個block都可以在多個dataname上存儲多個副本(副本數量也可以通過參數設置dfs.replication);
HDFS是設計成適應一次寫入,多次讀出的場景,且不支持文件的修改(注:適合用來做數據分析,並不適合用來做網盤應用,因為,不便修改,延遲大,網絡開銷大,成本太高)。
HDFS原理篇
工作機制:
工作機制的學習主要是為加深對分佈式系統的理解,以及增強遇到各種問題時的分析解決能力,形成一定的集群運維能力。注:很多不是真正理解hadoop技術體系的人會常常覺得HDFS可用於網盤類應用,但實際並非如此。要想將技術準確用在恰當的地方,必須對技術有深刻的理解。
1 概述
- HDFS集群分為兩大角色:NameNode、DataNode
- NameNode負責管理整個文件系統的元數據
- DataNode負責管理用戶的文件數據塊
- 文件會按照固定的大小(blocksize)切成若干塊後分布式存儲在若干臺datanode上
- 每一個文件塊可以有多個副本,並存放在不同的datanode上
- DataNode會==定期==向NameNode彙報自身所保存的文件block信息,而namenode則會負責保持文件的副本數量
- HDFS的內部工作機制對客戶端保持透明,客戶端請求訪問HDFS都是通過向namenode申請來進行
2 HDFS寫數據流程
客戶端要向HDFS寫數據,首先要跟namenode通信以確認可以寫文件並獲得接收文件block的datanode,然後客戶端按順序將文件逐個block傳遞給相應datanode,並由接收到block的datanode負責向其他datanode複製block的副本。
這裡說明文件的切割是在客戶端實現的,而不是NameNode。文件的傳輸也是由客戶端傳到指定datanode上,副本由datanode傳給其他datanode。
詳細步驟(重要):
- 跟namenode通信請求上傳文件,==namenode檢查目前文件是否已存在,父目錄是否存在==
- namenode返回是否可以上傳
- client請求第一個block該傳輸到哪些datanode服務器上(副本)
- namenode返回3個datanode服務器ABC(假如副 本數為3。優先找同機架的,其次不同機架,再其次是同機架的再一臺機器。還會根據服務器的容量,)
- client請求3臺datanode中的一臺A上傳數據==(本質上是一個RPC調用,建立pipeline)==,A收到請求會繼續調用B,然後B調用C,將整個pipeline建立完成,逐級返回客戶端
- client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet為單位,A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答。
- 當一個block傳輸完成之後,client再次請求namenode上傳第二個block的服務器。
3. HDFS讀數據流程
概述:
客戶端將要讀取的文件路徑發給namenode,namenode獲取文件的元信息(主要是block的存放位置信息)返回給客戶端,客戶端根據返回的信息找到相應datanode逐個獲取文件的block並在客戶端進行數據追加合併從而獲得整個文件。
詳細步驟解析:
跟namenode通信查詢元數據,找到文件塊所在的datanoede服務器挑選一臺datanode(就近原則,然後隨機)服務器,請求建立socket流datanode開始發送數據(從磁盤裡面讀取數據放入流,以packet為單位來做校驗)客戶端以packet為單位接收,先在本地緩存,然後寫入目標文件。
NAMENODE工作機制
學習目標:理解namenode的工作機制尤其是元數據管理機制,以增強對HDFS工作原理的理解,及培養hadoop集群運營中"性能調優"、"namenode"故障問題的分析解決能力
職責:
<code>NAMENODE職責:
負責客戶端請求的響應
元數據的管理(查詢、修改)
元數據管理:
/<code>
<code>namenode對數據的管理採用了三種存儲形式:
內存元數據(NameSystem)
磁盤元數據鏡像文件(fsimage)
數據操作日誌文件(edits.xml)可通過日誌運算出元數據
/<code>
元數據存儲機制(重要):
A、內存中有一份完整的元數據(內存meta data)
B、磁盤有一個"準完整"的元數據鏡像(fsimage)文件(在namenode的工作目錄中)
C、用於銜接內存metadata和持久化元數據鏡像fsimage之間的操作日誌(edits文件)
注:當客戶端對hdfs中的文件進行新增或者修改操作,操作記錄首先被記入edits日誌文件中,當客戶端操作完成後,相應的元數據會更新到內存meta.data中。
元數據手動查看
可通過hdfs的一個工具來查看edits中的信息hdfs oev -i edits -o edits.xmlhdfs oiv -i fsimage_0000000087 -p XML -o fsimage.xml
inputfile: 要查看的fsimage文件
<code> outputfile:
/<code>
用於保存格式化之後的文件 process: 使用什麼進程解碼,XML|Web|...
Datanode工作職責:
<code>存儲管理用戶的文件塊數據
定期向namenode彙報自身所持有的block信息(通過心跳信息上報)
(這點很重要,因為當集群發生某些block副本失效時,集群如何恢復block初始副本數量的/<code>
閱讀更多 加米穀大數據 的文章