一、HDFS的shell(命令行客戶端)操作
常用命令參數(shù)介紹
-help
功能:輸出這個(gè)命令參數(shù)手冊(cè)
-ls
功能:顯示目錄信息
示例: hadoop fs -ls hdfs://hadoop-server01:9000/
備注:這些參數(shù)中,所有的hdfs路徑都可以簡(jiǎn)寫
-->hadoop fs -ls / 等同于上一條命令的效果
-mkdir
功能:在hdfs上創(chuàng)建目錄
示例:hadoop fs -mkdir -p /aaa/bbb/cc/dd
-moveFromLocal
功能:從本地剪切粘貼到hdfs
示例:hadoop fs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd
-moveToLocal
功能:從hdfs剪切粘貼到本地
示例:hadoop fs - moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt
--appendToFile
功能:追加一個(gè)文件到已經(jīng)存在的文件末尾
示例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt
可以簡(jiǎn)寫為:
Hadoop fs -appendToFile ./hello.txt /hello.txt
-cat
功能:顯示文件內(nèi)容
示例:hadoop fs -cat /hello.txt
-tail
功能:顯示一個(gè)文件的末尾
示例:hadoop fs -tail /weblog/access_log.1
-text
功能:以字符形式打印一個(gè)文件的內(nèi)容
示例:hadoop fs -text /weblog/access_log.1
-chgrp
-chmod
-chown
功能:linux文件系統(tǒng)中的用法一樣,對(duì)文件所屬權(quán)限
示例:
hadoop fs -chmod 666 /hello.txt
hadoop fs -chown someuser:somegrp /hello.txt
-copyFromLocal
功能:從本地文件系統(tǒng)中拷貝文件到hdfs路徑去
示例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
-copyToLocal
功能:從hdfs拷貝到本地
示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
-cp
功能:從hdfs的一個(gè)路徑拷貝hdfs的另一個(gè)路徑
示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-mv
功能:在hdfs目錄中移動(dòng)文件
示例: hadoop fs -mv /aaa/jdk.tar.gz /
-get
功能:等同于copyToLocal,就是從hdfs下載文件到本地
示例:hadoop fs -get /aaa/jdk.tar.gz
-getmerge
功能:合并下載多個(gè)文件
示例:比如hdfs的目錄 /aaa/下有多個(gè)文件:log.1, log.2,log.3,...
hadoop fs -getmerge /aaa/log.* ./log.sum
-put
功能:等同于copyFromLocal
示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-rm
功能:刪除文件或文件夾
示例:hadoop fs -rm -r /aaa/bbb/
-rmdir
功能:刪除空目錄
示例:hadoop fs -rmdir /aaa/bbb/ccc
-df
功能:統(tǒng)計(jì)文件系統(tǒng)的可用空間信息
示例:hadoop fs -df -h /
-du
功能:統(tǒng)計(jì)文件夾的大小信息
示例:
hadoop fs -du -s -h /aaa/*
-count
功能:統(tǒng)計(jì)一個(gè)指定目錄下的文件節(jié)點(diǎn)數(shù)量
示例:hadoop fs -count /aaa/
-setrep
功能:設(shè)置hdfs中文件的副本數(shù)量
示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz
<這里設(shè)置的副本數(shù)只是記錄在namenode的元數(shù)據(jù)中,是否真的會(huì)有這么多副本,還得看datanode的數(shù)量>
二、hdfs的工作機(jī)制
1、概述
1. HDFS集群分為兩大角色:NameNode、DataNode (Secondary Namenode)
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ī)制對(duì)客戶端保持透明,客戶端請(qǐng)求訪問HDFS都是通過向namenode申請(qǐng)來進(jìn)
行
2、HDFS寫數(shù)據(jù)的流程
2.1、概述
客戶端要向HDFS寫數(shù)據(jù),首先要跟namenode通信以確認(rèn)可以寫文件并獲得接收文件block的datanode,然后,客戶端按順序?qū)⑽募饌€(gè)block傳遞給相應(yīng)datanode,并由接收到block的datanode負(fù)責(zé)向其他datanode復(fù)制block的副本。
2.2、詳細(xì)流程圖
2.2、詳細(xì)步驟解析
1、客戶端有一個(gè)文件cls.avi,300M,客戶端向namenode請(qǐng)求上傳文件/aaa/cls.avi,namenode查詢?cè)獢?shù)據(jù),元數(shù)據(jù)要檢查一下看有沒有/aaa這個(gè)目錄,沒有就不讓傳,假設(shè)條件滿足(有/aaa這個(gè)目錄)
2、元數(shù)據(jù)就給客戶端一個(gè)響應(yīng),說可以上傳
3、rpc請(qǐng)求上傳第一個(gè)block(0-128M),請(qǐng)返回哪幾臺(tái)datanode可以上傳(namenode記錄了這個(gè)集群里有哪些datanode,哪些在線,哪些已經(jīng)死掉了,每一臺(tái)datanode空間的大小,這是因?yàn)槊恳粋€(gè)datanode定期向namenode匯報(bào)它的信息)
4、假設(shè)返回dn1、dn3、dn4這3個(gè)datanode??紤]的因素有:空間、距離
客戶端說要返回幾個(gè)dn就返回幾個(gè)dn
上傳datanode的選擇策略是:
第一個(gè)副本:先考慮跟客戶端距離最近的,距離指的是客戶端到datanode之間網(wǎng)絡(luò)跳轉(zhuǎn)的極速,如果在同一個(gè)機(jī)架(路由器)下面,它們的距離基本上是一樣的,那這個(gè)時(shí)候就考慮空間,如果空間也都一樣的話,那就隨機(jī)了。
第二個(gè)副本:再考慮跨機(jī)架選擇一個(gè)datanode增加副本的可靠性,因?yàn)楦北局饕怯脕砜紤]安全的,如果在同一個(gè)機(jī)架上,如果機(jī)架斷電,那么就都找不到了。
第三個(gè)副本:就在第一個(gè)副本同機(jī)架挑選另外一個(gè)datanode存放
一般公司1個(gè)機(jī)架就搞定了,幾十臺(tái)機(jī)器
5、客戶端向datanode傳數(shù)據(jù)流,在傳之間要先建管道。先跟目標(biāo)機(jī)器(dn1)請(qǐng)求建立一個(gè)通道channel,告訴dn1要傳數(shù)據(jù),同時(shí)還要傳給dn3和dn4,dn1請(qǐng)求dn3建立一個(gè)通道,dn3請(qǐng)求dn4建立一個(gè)通道。
client---請(qǐng)求建立通道---->dn1----請(qǐng)求建立通道--->dn3---請(qǐng)求建立通道--------->dn4
| | |
| |
| |
|<-----應(yīng)答成功------dn1<------應(yīng)答成功-------dn3<------應(yīng)答成功(準(zhǔn)備好了)----
6、管道建成之后開始傳輸,從客戶端開始讀文件(0-128M),然后向datanode里面寫的,并不是把128M傳到dn1成功了才往dn3、dn4復(fù)制的,而是以一個(gè)一個(gè)的小數(shù)據(jù)包(packet,一個(gè)packet有64k)為單位來寫,先寫進(jìn)dn1的緩沖區(qū),然后一邊向dn1的block1的存儲(chǔ)區(qū)寫,一邊向dn3的緩沖區(qū)復(fù)制,dn3的緩沖區(qū)一邊向dn3的block1的存儲(chǔ)區(qū)寫,一邊向dn4的緩沖區(qū)寫,這樣,block1的三個(gè)副本幾乎同時(shí)傳完。
7、每一個(gè)packet都有應(yīng)答,上傳成功了就返回上傳成功了。block只要dn1上傳成功了客戶端就認(rèn)為上傳成功了,如果dn3、dn4沒上傳成功的話,沒有關(guān)系,namenode最后會(huì)做異步的同步,會(huì)將dn1上面的block于dn3、dn4進(jìn)行同步。如果dn1上傳失敗的話,就向namenode請(qǐng)求,說datanode1不行,請(qǐng)求再換一個(gè)datanode,這之后namenode就會(huì)幾下datanode1這臺(tái)機(jī)器有問題。
8、接下來客戶端上傳第二個(gè)block,這個(gè)時(shí)候會(huì)再次請(qǐng)求namenode,讓namenode返回三個(gè)datanode,按照上面的原則再選。
9、namenode就記下了這個(gè)文件上傳到哪個(gè)目錄,上傳了幾個(gè)block,每個(gè)block的每個(gè)副本都在哪個(gè)dn上。當(dāng)客戶端讀的時(shí)候就能夠返回這些信息
3、HDFS讀數(shù)據(jù)的流程
3.1 概述
客戶端將要讀取的文件路徑發(fā)送給namenode,namenode獲取文件的元信息(主要是block的存放位置信息)返回給客戶端,客戶端根據(jù)返回的信息找到相應(yīng)datanode逐個(gè)獲取文件的block并在客戶端本地進(jìn)行數(shù)據(jù)追加合并從而獲得整個(gè)文件
3.2、詳細(xì)步驟圖
3.3、詳細(xì)步驟解析
1、客戶端跟namenode通信查詢文件元數(shù)據(jù),namenode返回要查詢的文件的元數(shù)據(jù)信息(知道這個(gè)文件有幾個(gè)block,分別在哪里,比如說文件有三個(gè)block)
2、根據(jù)返回的元數(shù)據(jù)信息,找到找到第一個(gè)block所在的datanode服務(wù)器
3、挑選一臺(tái)datanode(就近原則,然后隨機(jī))服務(wù)器,請(qǐng)求讀取數(shù)據(jù)
4、建立通道,傳輸數(shù)據(jù)(datanode是向通道里面拉取數(shù)據(jù),客戶端是向通道里面讀取數(shù)據(jù)的)
5、第一個(gè)block傳輸完之后,按照上面的流程獲取第二個(gè)block
6、獲取到第二個(gè)block之后,將第二個(gè)block塊追加到第一個(gè)block的末尾
7、再獲取第三個(gè)block追加到文件的末尾,這樣整個(gè)文件就獲取到了
三、namenode的工作機(jī)制
1、namenode的職責(zé)
NAMENODE職責(zé):
負(fù)責(zé)客戶端請(qǐng)求的響應(yīng)
元數(shù)據(jù)的管理(查詢,修改)
2、元數(shù)據(jù)管理
每隔一段時(shí)間,會(huì)由secondary namenode將namenode上積累的所有edits和一個(gè)最新的fsimage下載到本地,并加載到內(nèi)存進(jìn)行merge(這個(gè)過程稱為checkpoint)
日志文件是滾動(dòng)的,一個(gè)正在寫的,幾個(gè)已經(jīng)寫好滾動(dòng)的,checkpoint時(shí)把正在寫的滾動(dòng)一下,然后把fsimage和日志文件下載到secondary namenode機(jī)器,只有第一次才會(huì)下載fsimage,這時(shí)fsimage不會(huì)很大,以后就只下載日志文件
元數(shù)據(jù)信息首先存在內(nèi)存里面,如果內(nèi)存里存滿的話, 定時(shí)dump到fsimage(整個(gè)內(nèi)存里面元數(shù)據(jù)的鏡像文件),內(nèi)存里面所有的數(shù)據(jù)在fsimage里面都有,其實(shí)就是序列化到fsimage
當(dāng)有元數(shù)據(jù)信息進(jìn)行更新的時(shí)候,首先先在內(nèi)存里面更新,然后在edits里面記錄操作日志,這樣即便當(dāng)前的namenode掛了,也能通過操作日志和fsimage(里面存的是老數(shù)據(jù))來得到全新的數(shù)據(jù)。
如果edits運(yùn)行久了,里面就會(huì)有非常多的操作日志了,這樣每次啟動(dòng)的時(shí)候加載edits就會(huì)加載很長(zhǎng)時(shí)間,會(huì)啟動(dòng)的特別慢,這個(gè)時(shí)候怎么做呢,將edits和fsimage定期的合并,形成新的fsimage,這樣遺留的edits日志就會(huì)非常的少。
1、secondary namenode和namenode之間會(huì)進(jìn)行心跳通信,secondary namenode會(huì)向namenode請(qǐng)求是否要做checkpoint,當(dāng)條件滿足(比如,設(shè)置的定時(shí)時(shí)間達(dá)到了,或者edits里面日志的數(shù)量達(dá)到了),2、會(huì)請(qǐng)求做checkpoint,當(dāng)執(zhí)行了checkpoint 3、namenode滾動(dòng)當(dāng)前正在寫的edits 4、然后將所有的日志文件,包括剛剛滾動(dòng)出來的日志文件和fsimage下載到secondary namenode
5、在secondary namenode上將日志文件和fsimage加載到secondary namenode的內(nèi)存合并成更新后的元數(shù)據(jù),6、將元數(shù)據(jù)dump成新的fsimage.chkpoint文件 7、將fsimage.chkpoint文件上傳到namenode 8、將fsimage.chkpoint文件重命名成fsimage 9、當(dāng)?shù)诙卧賵?zhí)行checkpoint的時(shí)候,只把edits文件下載到secondary namenode就行了(因?yàn)閟econdary namenode已經(jīng)有fsimage文件了,namenode上的fsimage還是secondary namenode傳過去的),這時(shí)候?qū)dits和fsimage.chkpoint合并成最新的元數(shù)據(jù)信息,dump成fsimage.chkpoint,上傳到namenode就行了。
edits和fsimage盡可能的追上內(nèi)存中的數(shù)據(jù)
namenode對(duì)數(shù)據(jù)的管理采用了三種存儲(chǔ)形式:
內(nèi)存元數(shù)據(jù)(NameSystem)
磁盤元數(shù)據(jù)鏡像文件
數(shù)據(jù)操作日志文件(可通過日志運(yùn)算出元數(shù)據(jù))
1
checkpoint操作的觸發(fā)條件配置參數(shù)
dfs.namenode.checkpoint.check.period=60 #檢查觸發(fā)條件是否滿足的頻率,60秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
#以上兩個(gè)參數(shù)做checkpoint操作時(shí),secondary namenode的本地工作目錄
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}
dfs.namenode.checkpoint.max-retries=3 #最大重試次數(shù)
dfs.namenode.checkpoint.period=3600 #兩次checkpoint之間的時(shí)間間隔3600秒
dfs.namenode.checkpoint.txns=1000000 #兩次checkpoint之間最大的操作記錄
2.1、