HDFS 技术
HDFS定義
Hadoop Distributed File System,是一個(gè)使用 Java 實(shí)現(xiàn)的、分布式的、可橫向擴(kuò)展的文件系
統(tǒng),是 HADOOP 的核心組件
HDFS特點(diǎn)
- 處理超大文件
- 流式地訪問數(shù)據(jù)
- 運(yùn)行于廉價(jià)的商用機(jī)器集群上;
HDFS 不適合以下場(chǎng)合: - 低延遲數(shù)據(jù)訪問
- 大量小文件的存儲(chǔ)
- 不支持多用戶寫入及任意修改文件
HDFS基本結(jié)構(gòu)
HDFS相關(guān)概念 --塊
- 可針對(duì)每個(gè)文件配置,由客戶端指定
- 每個(gè)塊有一個(gè)自己的全局ID
- 每個(gè)塊是一個(gè)獨(dú)立的存儲(chǔ)單位
- 以塊為單位在集群服務(wù)器上分配存儲(chǔ)
- 如果一個(gè)文件是200M,則它會(huì)被分為2個(gè)塊: 128+72
HDFS相關(guān)概念 --元數(shù)據(jù)
文件系統(tǒng)目錄樹信息
- 文件名,目錄名
- 文件和目錄的從屬關(guān)系
- 文件和目錄的大小,創(chuàng)建及最后訪問時(shí)間
- 權(quán)限
文件和塊的對(duì)應(yīng)關(guān)系
- 文件由哪些塊組成
塊的存放位置
- 機(jī)器名,塊ID
- 元數(shù)據(jù)存儲(chǔ)在NameNode服務(wù)器上;
- 實(shí)際數(shù)據(jù)儲(chǔ)存在集群的DataNode中
HDFS相關(guān)概念 --NameNode
NameNode是用來管理文件系統(tǒng)命名空間的組件。一個(gè)HDFS集群只有一臺(tái)(active)NameNode
- NameNode上存放了HDFS的元數(shù)據(jù),記錄了每個(gè)文件中各個(gè)塊所在的數(shù)據(jù)節(jié)點(diǎn)的位置信息。一個(gè)HDFS集群只有一份元數(shù)據(jù),可能有單點(diǎn)故障問題
- 元數(shù)據(jù)工作時(shí)在NameNode內(nèi)存中,以便快速查詢。1G內(nèi)存大致可存放1,000,000塊對(duì)應(yīng)的元數(shù)據(jù)信息。按缺省每塊64M計(jì)算,大致對(duì)應(yīng)64T實(shí)際數(shù)據(jù)
- 集群關(guān)閉時(shí),元數(shù)據(jù)持久化到磁盤中,啟動(dòng)集群時(shí),需要將元數(shù)據(jù)裝載到內(nèi)存中
NameNode數(shù)據(jù)結(jié)構(gòu)
- NameNode負(fù)責(zé)管理分布式文件系統(tǒng)的Namespace命名空間,保存了兩個(gè)核心數(shù)據(jù)結(jié)構(gòu):FsImage和EditLog
- FsImage用于維護(hù)文件系統(tǒng)樹以及文件樹中所有的文件和文件夾的元數(shù)據(jù);
- 操作日志文件EditLog中記錄了所有針對(duì)文件的創(chuàng)建、刪除、重命名等操作;
NameNode 工作原理
在名稱節(jié)點(diǎn)啟動(dòng)的時(shí)候,它會(huì)將FsImage文件中的內(nèi)容加載到內(nèi)存中,之后再執(zhí)行EditLog文件中的各項(xiàng)操作,使得內(nèi)存中的元數(shù)據(jù)和實(shí)際的同步,存在內(nèi)存中的元數(shù)據(jù)支持客戶端的讀操作。
一旦在內(nèi)存中成功建立文件系統(tǒng)元數(shù)據(jù)的映射,則創(chuàng)建一個(gè)新的FsImage文件和一個(gè)空的EditLog文件
在名稱節(jié)點(diǎn)運(yùn)行期間,HDFS的所有更新操作都是直接寫到EditLog中,久而久之, EditLog文件將會(huì)變得很大。當(dāng)EditLog文件非常大的時(shí)候,會(huì)導(dǎo)致名稱節(jié)點(diǎn)啟動(dòng)操作非常慢,而在這段時(shí)間內(nèi)HDFS系統(tǒng)處于安全模式,一直無法對(duì)外提供寫操作,影響了用戶的使用。
HDFS相關(guān)概念 --SecondaryNameNode
第二名稱節(jié)點(diǎn)是HDFS
架構(gòu)中的一個(gè)組成部
分,協(xié)助NameNode完
成Fsimage和edits文件
合并工作,使得內(nèi)存
中的Fsimage保持“最
新”
。
SecondaryNameNode 一般是單獨(dú)運(yùn)行在一
臺(tái)機(jī)器上。
HDFS相關(guān)概念 --DataNode
- 塊的實(shí)際數(shù)據(jù)存放在DataNode上
- 每個(gè)塊會(huì)在本地文件系統(tǒng)產(chǎn)生兩個(gè)文件,一個(gè)是實(shí)際的數(shù)據(jù)文件,另一個(gè)是塊的附加信息文件,其中包括塊數(shù)據(jù)的長度、校驗(yàn)和,以及時(shí)間戳
- DataNode通過心跳包(Heartbeat)與NameNode通訊
- 客戶端讀取/寫入數(shù)據(jù)的時(shí)候直接與DataNode通信
- 集群運(yùn)行中可以安全加入和退出一些機(jī)器
HDFS體系結(jié)構(gòu)
DataNode
- NameNode是一個(gè)中心服務(wù)器,單一節(jié)點(diǎn),負(fù)責(zé)管理文件系統(tǒng)的命名空間(namespace)以及客戶端對(duì)文件的訪問;
- 文件操作,NameNode負(fù)責(zé)文件元數(shù)據(jù)的操作,DataNode負(fù)責(zé)處理文件內(nèi)容的讀寫請(qǐng)求,數(shù)據(jù)流不經(jīng)過NameNode,只會(huì)詢問它跟那個(gè)DataNode聯(lián)系;
- 副本存放在哪些DataNode上由NameNode來控制,根據(jù)全局情況做出塊放置決定,讀取文件時(shí)NameNode盡量讓用戶先讀取最近的副本,降低帶塊消耗和讀取時(shí)延
冗余存儲(chǔ)策略
- 每個(gè)塊在集群上會(huì)存儲(chǔ)多個(gè)副本(replication) –默認(rèn)復(fù)制份數(shù)為3; 可以動(dòng)態(tài)修改,可針對(duì)每個(gè)文件配置,由客戶端指定
- 某個(gè)塊的所有備份都是同一個(gè)ID –系統(tǒng)無需記錄 “哪些塊其實(shí)是同一份數(shù)據(jù)”
- 根據(jù)機(jī)架配置自動(dòng)分配備份位置(Rack Awareness)
- 優(yōu)點(diǎn):加快數(shù)據(jù)傳輸速度;容易檢查錯(cuò)誤;保證數(shù)據(jù)的可靠性
錯(cuò)誤恢復(fù)策略
名稱節(jié)點(diǎn)出錯(cuò)
名稱節(jié)點(diǎn)保存了所有的元數(shù)據(jù)信息,最核心的兩大數(shù)據(jù)結(jié)構(gòu)
是FsImage和Editlog。當(dāng)名稱節(jié)點(diǎn)出錯(cuò)時(shí),就可以根據(jù)備份
SecondaryNameNode中的FsImage和Editlog數(shù)據(jù)進(jìn)行恢復(fù)。
數(shù)據(jù)節(jié)點(diǎn)出錯(cuò)
- 數(shù)據(jù)節(jié)點(diǎn)定期向名稱節(jié)點(diǎn)發(fā)送“心跳”信息報(bào)告狀態(tài);
- 當(dāng)數(shù)據(jù)節(jié)點(diǎn)發(fā)生故障,或者網(wǎng)絡(luò)斷網(wǎng)時(shí),名稱節(jié)點(diǎn)就無法收到來自數(shù)據(jù)節(jié)點(diǎn)的心跳信息,這些數(shù)據(jù)節(jié)點(diǎn)就被標(biāo)記為“宕機(jī)”,節(jié)點(diǎn)上面的所有數(shù)據(jù)都會(huì)被標(biāo)記為“不可讀”,名稱節(jié)點(diǎn)不會(huì)再給它們發(fā)送任何I/O請(qǐng)求;
- 一些數(shù)據(jù)節(jié)點(diǎn)的不可用,會(huì)導(dǎo)致一些數(shù)據(jù)塊的副本數(shù)量小于冗余因子;名稱節(jié)點(diǎn)會(huì)定期檢查,一旦發(fā)現(xiàn)某個(gè)數(shù)據(jù)塊的副本數(shù)量小于冗余因子,就會(huì)啟動(dòng)數(shù)據(jù)冗余復(fù)制生成新的副本;
- HDFS和其它分布式文件系統(tǒng)的最大區(qū)別就是可以調(diào)整冗余數(shù)據(jù)的位置。
-
網(wǎng)絡(luò)傳輸和磁盤錯(cuò)誤等因素,都會(huì)造成數(shù)據(jù)錯(cuò)誤;客戶端在讀取到數(shù)據(jù)后,會(huì)采用md5和sha1對(duì)數(shù)據(jù)塊進(jìn)行校驗(yàn),以確定讀取到正確的數(shù)據(jù);
-
在文件被創(chuàng)建時(shí),客戶端就會(huì)對(duì)每一個(gè)文件塊進(jìn)行信息摘錄,并把這些信息寫入到同一個(gè)路徑的隱藏文件里面
-
當(dāng)客戶端讀取文件的時(shí)候,會(huì)先讀取該信息文件,然后,利用該信息文件對(duì)每個(gè)讀取的數(shù)據(jù)塊進(jìn)行校驗(yàn),如果校驗(yàn)出錯(cuò),客戶端就會(huì)請(qǐng)求到另外一個(gè)數(shù)據(jù)節(jié)點(diǎn)讀取該文件塊,并且向名稱節(jié)點(diǎn)報(bào)告這個(gè)文件塊有錯(cuò)誤,名稱節(jié)點(diǎn)會(huì)定期檢查并且重新復(fù)制這個(gè)塊
文件權(quán)限策略
- 與Linux文件權(quán)限類似 ( chmod, chown )r: read; w:write; x:execute,權(quán)限x對(duì)于文件忽略,對(duì)于文件夾表示是否允許訪問其內(nèi)容
- 如果Linux系統(tǒng)用戶zhangsan使用hadoop命令創(chuàng)建一個(gè)文件,那么這個(gè)文件在HDFS中owner是zhangsan
- HDFS的權(quán)限目的:阻止好人做錯(cuò)事,而不是阻止壞人做壞事。HDFS相信,你告訴我你是誰,我就認(rèn)為你是誰
安全模式
指文件系統(tǒng)所處的一種只讀的安全模式。HDFS啟動(dòng)時(shí)會(huì)在safemode狀態(tài)
$ hadoop dfsadmin -safemode get #安全模式當(dāng)前狀態(tài)信息 $ hadoop dfsadmin -safemode enter #進(jìn)入安全模式 $ hadoop dfsadmin -safemode leave #解除安全模式 $ hadoop dfsadmin -safemode wait #掛起,直到安全模式結(jié)束HDFS 寫操作
HDFS 讀操作
HDFS追加寫操作
HDFS命令行
cat
- 用途:顯示一個(gè)或多個(gè)文件內(nèi)容到控制臺(tái)
- 使用方法:hadoop fs -cat URI [URI …]
- 例子:
put/copyFromLocal
- 用途:將本地一個(gè)或多個(gè)文件導(dǎo)入HDFS。以上兩個(gè)命令唯一的不同時(shí)copyFromLocal的源只能是本地文件,而put可以讀取stdin的數(shù)據(jù)
- 使用方法:hadoop fs -put/copyFromLocal UR
- 例子:
get/copyToLocal
- 用途:將HDFS中的一個(gè)或多個(gè)文件導(dǎo)出到本地文件系統(tǒng)
- 使用方法: hadoop fs -get/copyToLocal [-ignorecrc] [-crc] URI < localsrc>
- 例子:
ls
- 用途:列出文件夾目錄信息,lsr 遞歸顯示文件
- 使用方法: hadoop fs -ls/lsr -h UR
ls
- 用途:檢查dfs的文件的健康狀況; 只能運(yùn)行在master上
- 使用方法: hadoop fsck [GENERIC_OPTIONS] [- move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]
啟動(dòng)HDFS服務(wù)
關(guān)閉HDFS服務(wù)
總結(jié)
- 上一篇: 梦到家人有牢狱之灾什么意思
- 下一篇: Mapreduce原理和YARN