原文地址:http://www.cnblogs.com/zhangyinhua/p/7657937.html
注:本系列為Hadoop學(xué)習(xí)筆記,非原創(chuàng)
HDFS概述
一、HDFS概述
(1)HDFS集群分為兩大角色:Namenode和datanode;
(2)Namenode負(fù)責(zé)管理整個(gè)文件系統(tǒng)的元數(shù)據(jù);
(3)Datanode負(fù)責(zé)管理用戶的文件數(shù)據(jù)塊;
(4)文件會(huì)按照固定的大小(blocksize)切分成若干塊分布式存儲(chǔ)在若干臺(tái)datanode上;
(5)每個(gè)文件可以有多個(gè)副本,并存放在不同的datanode上;
(6)Datanode會(huì)定期向Namenode匯報(bào)自身保存的block信息,而Namenode則會(huì)負(fù)責(zé)保持文件的副本數(shù)量;
(7)HDFS的內(nèi)部工作機(jī)制對于客戶端透明,客戶端的請求訪問HDFS都是通過Namenode申請進(jìn)行的。
二、HDFS的概念
(1)HDFS采用主從式(master\Slave)的體系結(jié)構(gòu),其中Namenode(NN)、Datanode(DN)和Client是HDFS中三個(gè)重要的角色;
(2)在一個(gè)HDFS中,有一個(gè)NN,一個(gè)SNN(Secondary Namenode)和眾多的DN,Client也可以有很多個(gè);
(3)NN管理HDFS中兩個(gè)重要的關(guān)系:目錄文件數(shù)結(jié)構(gòu)和文件與數(shù)據(jù)塊的對應(yīng)關(guān)系(會(huì)持續(xù)化到物理內(nèi)存,文件名叫fsimage);DN和數(shù)據(jù)塊的對應(yīng)關(guān)系,即數(shù)據(jù)塊存儲(chǔ)在哪些DN上(在DN啟動(dòng)時(shí)會(huì)上報(bào)NN它所維護(hù)的數(shù)據(jù)塊,這個(gè)過程是動(dòng)態(tài)建立的,不會(huì)持久化,所以集群啟動(dòng)需要較長時(shí)間);
(4)總之,HDFS是一個(gè)文件系統(tǒng),用于存儲(chǔ)文件,通過統(tǒng)一命名空間--目錄樹來定位文件。其次,它是分布式的,由很多服務(wù)器聯(lián)合實(shí)現(xiàn)其功能,集群中的服務(wù)器有各自的角色。
三、HDFS的特性
(1)HDFS中的文件在物理上是分塊存儲(chǔ)(Block),塊的大小可以通過參數(shù)配置(df.blocksize)來規(guī)定默認(rèn)大小。在hadoop2.x默認(rèn)為128M,以前版本為64M;
(2)HDFS文件系統(tǒng)會(huì)給客戶端提供一個(gè)統(tǒng)一的抽象目錄樹,客戶端通過路徑訪問文件;
(3)目錄結(jié)構(gòu)及文件分塊信息(元數(shù)據(jù))的管理由namenode節(jié)點(diǎn)承擔(dān),namenode節(jié)點(diǎn)是HDFS集群的主節(jié)點(diǎn),負(fù)責(zé)維護(hù)整個(gè)HDFS文件系統(tǒng)的目錄結(jié)構(gòu)以及每一個(gè)路徑對應(yīng)的block塊信息(block的id,以及所在的datanode服務(wù)器);
(4)文件的各個(gè)block的存儲(chǔ)管理由datanode節(jié)點(diǎn)承擔(dān),datanode是HDFS集群的從節(jié)點(diǎn),每個(gè)block都可以在多個(gè)datanode上存儲(chǔ)多個(gè)副本(副本參數(shù)可以通過dfs.replication設(shè)置);
(5)HDFS適應(yīng)一次寫入,多次讀出的場景,不支持文件的修改;
(6)總之,hdfs的特點(diǎn):保存多個(gè)副本,且提供容錯(cuò)機(jī)制,副本丟失或者宕機(jī)自動(dòng)恢復(fù)(默認(rèn)3備份),運(yùn)行在廉價(jià)的機(jī)器上,適合大數(shù)據(jù)的處理。

四、HDFS的局限性
(1)低延時(shí)數(shù)據(jù)訪問。由于HDFS為了高吞吐率做了設(shè)計(jì),犧牲了快速響應(yīng)。對于低延時(shí)的應(yīng)用,可以考慮使用HBase或者Cassandra;
(2)大量的小文件。存儲(chǔ)大量小文件不會(huì)浪費(fèi)實(shí)際存儲(chǔ)空間,但增加了在Namenode中元數(shù)據(jù),大量小文件會(huì)影響整個(gè)集群的性能(Btrfs為小文件做了優(yōu)化-inline file);
(3)多用戶寫入,修改文件。HDFS的文件只能有一個(gè)寫入者,而且寫操作智能在文件結(jié)尾追加。不支持多個(gè)寫入者,不支持任意位置的修改。
五、HDFS可靠性措施
(1)冗余備份;
(2)副本存放:采用機(jī)架感知(Rak-aware)的策略改進(jìn)數(shù)據(jù)可靠性、高可用和網(wǎng)絡(luò)帶寬的利用率;
(3)心跳檢測:Namenode周期從每個(gè)datanode接收心跳包和塊報(bào)告,收到說明Datanode工作正常;
(4)安全模式:系統(tǒng)啟動(dòng)時(shí),Namenode進(jìn)入一個(gè)安全模式,此時(shí)不會(huì)出現(xiàn)數(shù)據(jù)塊的寫操作;
(5)數(shù)據(jù)完整性檢測:HDFS客戶端實(shí)現(xiàn)對HDFS文件內(nèi)容的校驗(yàn)和(Checksum)檢查(dfs.bytes-per-checksum)。
HDFS基本概念
一、HDFS主從結(jié)構(gòu)體系

二、數(shù)據(jù)塊(DataBlock)
(1)HDFS將每個(gè)文件存儲(chǔ)成一系列的數(shù)據(jù)塊,每塊大小相同;
(2)文件的所有數(shù)據(jù)塊都存在備份,每個(gè)文件的數(shù)據(jù)塊大小和副本系數(shù)都是可以配置的(dfs.blocksize、dfs.replication);
(3)HDFS的文件都是一次寫入的,且任何時(shí)候只能有一個(gè)寫入者。
三、名字節(jié)點(diǎn)(主節(jié)點(diǎn):Namenode)

四、數(shù)據(jù)節(jié)點(diǎn)(從節(jié)點(diǎn):Datanode)
(1)概述:
1、DN是HDFS中硬盤IO最忙碌的部分:將HDFS的數(shù)據(jù)塊寫到Linux本地文件系統(tǒng),或者從這些數(shù)據(jù)塊中讀取數(shù)據(jù)。DN作為從節(jié)點(diǎn),會(huì)不斷向NN發(fā)送心跳;
2、初始化時(shí),每個(gè)DN將當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)塊上報(bào)給NN。DN也會(huì)接受來自NN的指令,比如創(chuàng)建、移動(dòng)或刪除本地?cái)?shù)據(jù)塊,并將本地的更新報(bào)告返回給NN;
(2)作用:接受客戶端或Namenode的調(diào)度;存儲(chǔ)和檢索數(shù)據(jù)塊;在Namenode統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制;定期向Namenode發(fā)送自身存儲(chǔ)的數(shù)據(jù)塊列表。
五、Secondary Namenode
(1)定期合并edits和fsimage(如果沒有配置Secondary Namenode則由Namenode完成),并按照集群配置的時(shí)間將合并后新的fsimage,上傳到NN替換舊的fsimage;
(2)防止edits日志文件過大,SNN配合NN,為NN的第一關(guān)系提供簡單的Checkpoint機(jī)制,并避免出現(xiàn)edits過大,導(dǎo)致NN啟動(dòng)時(shí)間過長問題;
(3)提供Namenode的fsimage文件的檢查點(diǎn),以實(shí)現(xiàn)Namenode故障恢復(fù)。

單點(diǎn)故障問題
一、單點(diǎn)故障問題
(1)描述:Namenode失效,導(dǎo)致客戶端或MapReduce作業(yè)均無法讀寫查看文件;
(2)解決方法:
1、啟動(dòng)一個(gè)擁有文件系統(tǒng)元數(shù)據(jù)的新Namenode(一般采用,因?yàn)閺?fù)制元數(shù)據(jù)非常耗時(shí));
2、配置一對活動(dòng)-備用(Active-Sandby)Namenode,活動(dòng)Namenode失效時(shí),備用Namenode立即接管,用戶不會(huì)有明顯的中斷(借助NFS、Zookeeper等共享編輯日志文件;Datanode同時(shí)向兩個(gè)Namenode匯報(bào)數(shù)據(jù)塊信息;客戶端采用特殊處理對用戶透明)
HDFS高可用性(HA:High-Availability)
一、HA
(1)原理:為了應(yīng)對“單點(diǎn)失敗”問題,減少問題處理時(shí)間和對用戶的影響,Hadoop2.x引入active-standby模式的一對namenodes。當(dāng)active的Namenode發(fā)生故障時(shí),standby的機(jī)器會(huì)替代active的機(jī)器,成為新的Namenode。
(2)active-standby架構(gòu):
1、兩個(gè)Namenode之間共享同一塊存儲(chǔ)空間,一邊共享編輯日志(edit log)。早期實(shí)現(xiàn)采用高可用的NFS,現(xiàn)在可以使用Zookeeper解決;
2、Datanode必須向兩個(gè)Namenode同時(shí)匯報(bào)存儲(chǔ)情況;
3、客戶端配置成自動(dòng)處理Namenode失敗的情況,對用戶透明。
(3)判斷active的Namenode的是否還正常,主要通過心跳請求來確認(rèn)的。當(dāng)故障發(fā)生時(shí),切換到standby的Namenode提供服務(wù)時(shí),但原來的active的Namenode可能由于網(wǎng)絡(luò)慢等原因?qū)е庐?dāng)時(shí)不能提供服務(wù),后續(xù)又可以提供服務(wù),這時(shí)需要阻止它再次加入系統(tǒng),比如殺掉進(jìn)程等。
HDFS的客戶端操作
一、HDFS的Shell操作
(1)查看命令幫助:hdfs -help
(2)查看文件系統(tǒng)命令幫助:hdfs dfs -help
二、HDFS DFS命令詳解
(1)創(chuàng)建目錄:
hadoop dfs -mkdir /input --->創(chuàng)建指定目錄
hadoop dfs -mkdir -p /user/hdfs --->遞歸創(chuàng)建指定目錄
(2)查看文件或目錄:
hdfs dfs -ls ---> 查看目錄結(jié)構(gòu)
hdfs dfs -ls /input ---> 查看指定目錄結(jié)構(gòu)
hdfs dfs -ls -R ---> 遞歸顯示當(dāng)前目錄
hdfs dfs -ls -R /input ---> 遞歸顯示指定目錄
(3)文件上傳:
hdfs dfs -put local_file input ---> 將本地文件local_file上傳到input
(4)下載文件或目錄到本地:
hdfs dfs -get input . ---> 下載文件到當(dāng)前目錄
(5)瀏覽hdfs中的文件:
hdfs dfs -cat input/local_file ---> 瀏覽hdfs中的 文件
(6)刪除文件:
hdfs dfs -rm input/local_file ---> 刪除文件
(7)在hdfs中復(fù)制文件:
hdfs dfs -cp input/local_file input/local_file.bak 復(fù)制文件
(8)修改權(quán)限:
hdfs dfs -chmod 777 /input/somewords.txt 修改權(quán)限
三、HDFS管理命令
(1)系統(tǒng)目錄檢查
hdfs fsck /user/xxx 系統(tǒng)目錄詳細(xì)檢測
(2)檢查Datanode報(bào)告
hdfs dfsadmin -report
(3)權(quán)限管理
hdfs fs -chmod 666 /user/xxx
(4)hdfs空間目錄配額設(shè)置
hdfs dfsadmin -setSpaceQuota [N] /user/xxx
(5)hdfs空間目錄配額清除
hdfs dfsadmin -clrSpaceQuota /user/xxx
(6)查看目錄配額設(shè)置
hdfs fs -count q /user/xxx
(7)刪除Datanode
hdfs dfsadmin -refreshNodes