玉林市住房和城鄉(xiāng)建設(shè)廳網(wǎng)站怎樣申請(qǐng)網(wǎng)站
文章作者郵箱:yugongshiye@sina.cn? ? ? ? ? ? ? 地址:廣東惠州
?▲ 本章節(jié)目的
??了解hadoop的定義和特點(diǎn);
??掌握hadoop的基礎(chǔ)結(jié)構(gòu);
? 掌握hadoop的常見命令;
? 了解hadoop的執(zhí)行流程;
一、簡(jiǎn)介
1.?概述
1. HDFS(Hadoop Distributed File System - Hadoop分布式文件系統(tǒng))是Hadoop提供的一套用于進(jìn)行分布式存儲(chǔ)的機(jī)制。
2. HDFS是Doug Cutting根據(jù)Google的論文<The Google File System>(GFS)來仿照實(shí)現(xiàn)的。
2.?特點(diǎn)
1. 能夠存儲(chǔ)超大文件。在HDFS集群中,只要節(jié)點(diǎn)數(shù)量足夠多,那么一個(gè)文件無論是多大都能夠進(jìn)行存儲(chǔ) - HDFS會(huì)對(duì)文件進(jìn)行切塊處理。
2.?快速的應(yīng)對(duì)和檢測(cè)故障。在HDFS集群中,運(yùn)維人員不需要頻繁的監(jiān)聽每一個(gè)節(jié)點(diǎn),可以通過監(jiān)聽NameNode來確定其他節(jié)點(diǎn)的狀態(tài) - DataNode會(huì)定時(shí)的給NameNode來發(fā)送心跳。
3. 具有高容錯(cuò)性。在HDFS中,會(huì)自動(dòng)的對(duì)數(shù)據(jù)來保存多個(gè)副本,所以不會(huì)因?yàn)橐粋€(gè)或者幾個(gè)副本的丟失就導(dǎo)致數(shù)據(jù)產(chǎn)生丟失。
4. 具有高吞吐量。吞吐量實(shí)際上指的是集群在單位時(shí)間內(nèi)讀寫的數(shù)據(jù)總量。
5. 可以在相對(duì)廉價(jià)的機(jī)器上來進(jìn)行橫向擴(kuò)展。
6. 不支持低延遲的訪問。在HDFS集群中,響應(yīng)速度一般是在秒級(jí)別,很難做到在毫秒級(jí)別的響應(yīng)。
7. 不適合存儲(chǔ)大量的小文件。每一個(gè)小文件都會(huì)產(chǎn)生一條元數(shù)據(jù),大量的小文件就會(huì)產(chǎn)生大量的元數(shù)據(jù)。元數(shù)據(jù)過多,會(huì)占用大量?jī)?nèi)存,同時(shí)會(huì)導(dǎo)致查詢效率變低。
8. 簡(jiǎn)化的一致性模型。在HDFS中,允許對(duì)文件進(jìn)行一次寫入多次讀取,不允許修改,但是允許追加寫入。
9. 不支持超強(qiáng)事務(wù)甚至不支持事務(wù)。在HDFS中,因?yàn)閿?shù)據(jù)量較大,此時(shí)不會(huì)因?yàn)橐粋€(gè)或者幾個(gè)數(shù)據(jù)塊出現(xiàn)問題就導(dǎo)致所有的數(shù)據(jù)重新寫入 - 在數(shù)據(jù)量足夠大的前提下,允許出現(xiàn)容錯(cuò)誤差。
二、基本概念
1.?基本結(jié)構(gòu)
1. HDFS本身是一個(gè)典型的主從(M/S)結(jié)構(gòu):主節(jié)點(diǎn)是NameNode,從節(jié)點(diǎn)是DataNode。
2. HDFS會(huì)對(duì)上傳的文件進(jìn)行切分處理,切出來的每一個(gè)數(shù)據(jù)塊稱之為Block。
3. HDFS會(huì)對(duì)上傳的文件進(jìn)行自動(dòng)的備份。每一個(gè)備份稱之為是一個(gè)副本(replication/replicas)。如果不指定,默認(rèn)情況下,副本數(shù)量為3。
4. HDFS仿照Linux設(shè)計(jì)了一套文件系統(tǒng),允許將文件存儲(chǔ)到不同的虛擬路徑下,同時(shí)也設(shè)計(jì)了一套和Linux一樣的權(quán)限策略。HDFS的根路徑是/。
2.?Block
1. Block是HDFS中數(shù)據(jù)存儲(chǔ)的基本形式,即上傳到HDFS上的數(shù)據(jù)最終都會(huì)以Block的形式落地到DataNode的磁盤上。
2. 如果不指定,默認(rèn)情況下,Block的大小是134217728B(即128M)??梢酝ㄟ^dfs.blocksize屬性來調(diào)節(jié),放在hdfs-site.xml文件中,單位是字節(jié)。
3. 如果一個(gè)文件不足一個(gè)Block的指定大小,那么這個(gè)文件是多大,它所對(duì)應(yīng)的Block就是多大。例如一個(gè)文件是70M,那么對(duì)應(yīng)的Block就是70M。屬性dfs.blocksize指定的值實(shí)際上可以立即為一個(gè)Block的最大容量。
4. 注意,在設(shè)計(jì)Block大小的時(shí)候,Block是維系在DataNode的磁盤上,要考慮Block在磁盤上的尋址時(shí)間以及傳輸時(shí)間(寫入時(shí)間)的比例值。一般而言,當(dāng)尋址時(shí)間是傳輸時(shí)間的1%的時(shí)候,效率最高。而計(jì)算機(jī)在磁盤上的尋址時(shí)間大概在10ms左右,那么寫入時(shí)間就是10ms/0.01=1000ms=1s??紤]到絕大部分的服務(wù)器使用的是機(jī)械磁盤,機(jī)械磁盤的寫入速度一般在120MB/s左右,此時(shí)一個(gè)Block大小是1s*120MB/s=120M左右。
5. HDFS會(huì)為每一個(gè)Block來分配一個(gè)唯一的編號(hào)BlockID。
6. 切塊的意義:
a. 能夠存儲(chǔ)超大文件。
b. 能夠進(jìn)行快速備份。
3.?NameNode
1. NameNode是HDFS中的主(核心)節(jié)點(diǎn)。在Hadoop1.X中,NameNode只能有1個(gè),容易存在單點(diǎn)故障;在Hadoop2.X中,NameNode最多允許存在2個(gè);在Hadoop3.X中,不再限制NameNode的數(shù)量,也因此在Hadoop3.X的集群中,NameNode不存在單點(diǎn)故障。
2. NameNode的作用:對(duì)外接收請(qǐng)求,記錄元數(shù)據(jù),管理DataNode。
3. 元數(shù)據(jù)(metadata)是用于描述數(shù)據(jù)的數(shù)據(jù)(大概可以將元數(shù)據(jù)理解為賬本)。在HDFS中,元數(shù)據(jù)實(shí)際上是用于描述文件的一些性質(zhì)。在HDFS中,將元數(shù)據(jù)拆分成了很多項(xiàng),主要包含了以下幾項(xiàng):
a. 上傳的文件名以及存儲(chǔ)的虛擬路徑,例如/log/a.log。
b. 文件對(duì)應(yīng)的上傳用戶以及用戶組。
c. 文件的權(quán)限,例如-rwxr-xr--。
d. 文件大小。
e. Block大小。
f. 文件和BlockID的映射關(guān)系。
g. BlockID和DataNode的映射關(guān)系。
h. 副本數(shù)量等。
4. 一條元數(shù)據(jù)大小大概在150B左右。
5. 元數(shù)據(jù)是維系在內(nèi)存以及磁盤中。
a. 維系在內(nèi)存中的目的是查詢快
b. 維系在磁盤中的目的是持久化
6. 元數(shù)據(jù)在磁盤上的存儲(chǔ)位置由屬性hadoop.tmp.dir來決定,是放在core-site.xml文件中。如果不指定,默認(rèn)情況下是放在/tmp下。
7. 和元數(shù)據(jù)相關(guān)的文件:
a. edits:寫操作文件。用于記錄HDFS的寫操作。
b. fsimage:元映像文件。存儲(chǔ)了NameNode對(duì)元數(shù)據(jù)的序列化形態(tài)(大概可以理解為元數(shù)據(jù)在磁盤上的持久化存儲(chǔ)形式)。
8. 當(dāng)NameNode接收到寫操作(命令)的時(shí)候,會(huì)先將這個(gè)寫操作(命令)記錄到edits_inprogress文件中。記錄成功之后,NameNode會(huì)解析這個(gè)命令,然后修改內(nèi)存中的元數(shù)據(jù)。修改成功之后,會(huì)給客戶端來返回一個(gè)ACK信號(hào)表示成功。在這個(gè)過程中,會(huì)發(fā)現(xiàn),fsimage文件中的元數(shù)據(jù)并沒有發(fā)生變化。
9. 隨著運(yùn)行時(shí)間的推移,edits_inprogress文件中記錄的命令會(huì)越來越多,同時(shí)fsiamge文件中的元數(shù)據(jù)和內(nèi)存中的元數(shù)據(jù)差別也會(huì)越來越大。因此,當(dāng)達(dá)到指定條件的時(shí)候,edits_inprogress這個(gè)文件會(huì)產(chǎn)生滾動(dòng),滾動(dòng)生成一個(gè)edits文件,同時(shí)產(chǎn)生一個(gè)新的edits_ingprogress文件。新來的寫操作會(huì)記錄到新的edits_inprogress文件中。滾動(dòng)生成edits文件之后,NameNode會(huì)將edits文件中的命令再一一取出,解析之后修改fsimage文件中的元數(shù)據(jù)。
10.?edits_inprogress文件的滾動(dòng)條件:
a. 空間:當(dāng)edits_inprogress文件達(dá)到指定大小(默認(rèn)是40000,即當(dāng)edits_inprogress文件中記錄的元數(shù)據(jù)條目數(shù)達(dá)到40000條,可以通過屬性dfs.namenode.checkpoint.txns來修改,放在hdfs-site.xml文件中)的時(shí)候,會(huì)自動(dòng)滾動(dòng)生成一個(gè)edits文件。
b. 時(shí)間:當(dāng)距離上一次的滾動(dòng)時(shí)間間隔達(dá)到指定大小(默認(rèn)是3600s,可以通過屬性dfs.namenode.checkpoint.period來修改,單位是秒,放在hdfs-site.xml文件匯總)的時(shí)候,edits_inprogress文件也會(huì)產(chǎn)生滾動(dòng)。
c. 重啟:當(dāng)NameNode被重啟的時(shí)候,會(huì)自動(dòng)觸發(fā)edits_inprogress文件的滾動(dòng)。
d. 強(qiáng)制:可以通過hdfs dfsadmin -rollEdits命令來強(qiáng)制滾動(dòng)。
11. 查看edits文件:hdfs oev -i edits_0000000000000000002-0000000000000000009 -o edits.xml
12. 在HDFS中,會(huì)將每一個(gè)寫操作看作是一個(gè)事務(wù),會(huì)給這個(gè)事務(wù)分配一個(gè)全局遞增的編號(hào),稱之為事務(wù)id,簡(jiǎn)寫為txid
13. 在HDFS中,會(huì)將開始記錄日志以及結(jié)束記錄日志都看作是一個(gè)寫操作,都會(huì)分配一個(gè)事務(wù)id。因此,每一個(gè)edits文件,基本上都是以O(shè)P_START_LOG_SEGMENT開頭,都是以O(shè)P_END_LOG_SEGMENT結(jié)尾
14. 查看fsimage文件:hdfs oiv -i fsimage_0000000000000000009 -o fsimage.xml -p XML
15. 每一個(gè)fsimage文件都會(huì)伴隨著產(chǎn)生一個(gè).md5文件,這個(gè)文件是對(duì)fsimage文件進(jìn)行校驗(yàn)的
16. 需要注意的是,Hadoop在第一次啟動(dòng)之后的1min的時(shí)候,會(huì)自動(dòng)觸發(fā)一次edits_inprogress文件的滾動(dòng),之后就是按照指定的時(shí)間間隔來進(jìn)行滾動(dòng)
17. NameNode通過心跳機(jī)制來管理DataNode:DataNode會(huì)定時(shí)(默認(rèn)是3s,通過屬性dfs.heartbeat.interval來決定,單位是秒,放在hdfs-site.xml文件中)給NameNode發(fā)送心跳。如果超過指定的時(shí)間,NameNode沒有收到DataNode的心跳,那么NameNode就會(huì)認(rèn)為這個(gè)DataNode已經(jīng)lost(丟失),此時(shí)NameNode會(huì)將這個(gè)DataNode上的數(shù)據(jù)復(fù)制一份備份到其他節(jié)點(diǎn)上來保證整個(gè)集群中的副本數(shù)量
18. 心跳的超時(shí)時(shí)間是由屬性dfs.namenode.heartbeat.recheck-interval來決定。如果不指定,默認(rèn)是300000,單位是毫秒,即300s=5min。但是在計(jì)算超時(shí)時(shí)間的時(shí)候,實(shí)際超時(shí)時(shí)間=2*dfs.namenode.heartbeat.recheck-interval + 10*dfs.heartbeat.interval來決定,所以如果不指定,實(shí)際超時(shí)時(shí)間為 2*5min + 10*3s = 10min30s
19. 心跳信號(hào)主要包含:
a. clusterid:集群編號(hào)。
Ⅰ. 在HDFS中,當(dāng)NameNode被格式化(hadoop namenode -format)的時(shí)候,會(huì)自動(dòng)計(jì)算產(chǎn)生一個(gè)clusterid。每次NameNode被格式化,都會(huì)自動(dòng)重新計(jì)算產(chǎn)生一個(gè)新的clusterid。
Ⅱ. 當(dāng)HDFS集群?jiǎn)?dòng)之后,NameNode就會(huì)等待DataNode的心跳。當(dāng)NameNode第一次收到DataNode的心跳之后,會(huì)將clusterid在心跳響應(yīng)中返回給DataNode。
Ⅲ. 當(dāng)DataNode收到心跳響應(yīng)之后,會(huì)將clusterid獲取并且記錄到本地的磁盤中,之后DataNode和NameNode之間進(jìn)行的每一次通信(包括心跳)都會(huì)攜帶這個(gè)clusterid。
Ⅳ. NameNode在收到DataNode的請(qǐng)求之后,會(huì)先校驗(yàn)clusterid是否一致,如果不一致,則會(huì)放棄這個(gè)請(qǐng)求;如果一致,才會(huì)處理這個(gè)請(qǐng)求。
Ⅴ. 如果NameNode被多次格式化,就會(huì)導(dǎo)致DataNode和NameNode之間無法進(jìn)行通信。
b. 當(dāng)前DataNode的節(jié)點(diǎn)狀態(tài)(預(yù)服役、服役、預(yù)退役)。
c. 當(dāng)前DataNode上存儲(chǔ)的Block的校驗(yàn)信息。
20. 安全模式:
a. 當(dāng)NameNode被重啟之后,自動(dòng)進(jìn)入安全模式。
b. 在安全模式中,NameNode會(huì)先自動(dòng)觸發(fā)edits_inprogress文件的滾動(dòng),滾動(dòng)完成之后,會(huì)觸發(fā)fsimage文件的更新。fsiamge文件更新完成之后,NameNode會(huì)將fsimage文件中的元數(shù)據(jù)加載到內(nèi)存中,加載完成之后,會(huì)等待DataNode的心跳。
c. 如果沒有收到DataNode的心跳,那么說明NameNode被重啟過程中,DataNode也出現(xiàn)了骨渣古,此時(shí)NameNode就需要將DataNode上的數(shù)據(jù)備份到其他節(jié)點(diǎn)上來保證集群中的副本數(shù)量;如果NameNode收到了DataNode的心跳,會(huì)校驗(yàn)DataNode上的Block信息。如果校驗(yàn)失敗,那么NameNode會(huì)試圖恢復(fù)這個(gè)DataNode上的數(shù)據(jù),恢復(fù)完成之后會(huì)再次校驗(yàn),如果校驗(yàn)失敗,則重新恢復(fù)重新校驗(yàn);如果校驗(yàn)成功,則NameNode自動(dòng)退出安全模式。
21. 之所以存在安全模式,實(shí)際上是HDFS集群保證數(shù)據(jù)的完整性。
22. 在安全模式中,HDFS集群只能讀(下載)不能寫(上傳)。
23. 在實(shí)際過程中,如果在合理時(shí)間內(nèi),HDFS集群依然沒有退出安全模式,則說明數(shù)據(jù)已經(jīng)產(chǎn)生了不可挽回的丟失,此時(shí)需要考慮強(qiáng)制退出安全模式。
24. 常見命令:
命令 | 解釋 |
hdfs dfsadmin -safemode enter | 進(jìn)入安全模式 |
hdfs dfsadmin -safemode get | 查看安全模式狀態(tài) |
hdfs dfsadmin -safemode leave | 退出安全模式 |
4.?DataNode
1. DataNode是HDFS的從節(jié)點(diǎn),主要用于存儲(chǔ)數(shù)據(jù),數(shù)據(jù)會(huì)以Block形式落地到磁盤上。
2. 數(shù)據(jù)在磁盤上的存儲(chǔ)位置同樣由hadoop.tmp.dir屬性來決定。
3. DataNode會(huì)為每一個(gè)Block生成一個(gè)blk_xxx.meta文件,這個(gè)meta文件實(shí)際上是blk文件的校驗(yàn)文件。
4. DataNode的狀態(tài):預(yù)服役、服役、預(yù)退役、退役、丟失。
5. DataNode通過心跳機(jī)制向NameNode來注冊(cè)信息。
5.?SecondaryNameNode
1. SecondaryNameNode不是NameNode的熱備份,但是SecondaryNameNode能夠一定程度上對(duì)元數(shù)據(jù)做到備份,但不是全部 - SecondaryNameNode主要是負(fù)責(zé)edits_inprogress文件的滾動(dòng)和fsimage文件的更新。
2. 在集群中,如果存在SecondaryNameNode,那么edits_inprogress文件的滾動(dòng)和fsimage文件的更新是由SecondaryNameNode來完成;如果沒有SecondaryNameNode,那么edits_inprogress文件的滾動(dòng)和fsimage文件的更新就會(huì)由NameNode自己來完成。
3. 到目前為止,HDFS集群只支持兩種結(jié)構(gòu):
a. 1個(gè)NameNode+1個(gè)SecondaryNameNode+n個(gè)DataNode。
b. n個(gè)NameNode(Hadoop2.X中是2個(gè),Hadoop3.X中是n個(gè),1個(gè)Active+多個(gè)Standby狀態(tài))+n個(gè)DataNode。
4. 在HDFS集群中,NameNode如果只有1個(gè),那么NameNode宕機(jī)之后,整個(gè)集群就無法對(duì)外提供服務(wù),所以必須對(duì)NameNode來進(jìn)行備份,避免單點(diǎn)故障,所以在集群中,要考慮使用上述的第二種方案。
6.?機(jī)架感知策略
1. 在HDFS中,機(jī)架感知策略默認(rèn)是不開啟的。如果需要開啟機(jī)架感知策略,那么需要在hadoop-site.xml文件中添加如下配置:
<property>
<name>topology.script.file.name</name>
<value>path/rackaware.py</value>
</property
2. 上述配置的value中,需要指定一個(gè)腳本文件的存儲(chǔ)路徑。腳本文件可以使用Python或者Shell等常見腳本語言來實(shí)現(xiàn)。
3. 在這個(gè)腳本中,需要定義一個(gè)Map。Map的鍵是主機(jī)名或者IP,Map的值是用戶指定的機(jī)架名。只要保證值一致,那么就表示值對(duì)應(yīng)的鍵放在同一個(gè)機(jī)架上。
4. 由于這個(gè)機(jī)架是通過Map映射來完成的,所以本質(zhì)上是一個(gè)邏輯機(jī)架,也因此可以將不同物理機(jī)架上的節(jié)點(diǎn)配置在同一個(gè)邏輯機(jī)架上。在實(shí)際開發(fā)過程中,為了方便管理,往往是將同一個(gè)物理機(jī)架上的節(jié)點(diǎn)配置在同一個(gè)邏輯機(jī)架上。
7.?副本放置策略
1. 在HDFS中,支持多副本策略,這樣能夠有效的保證數(shù)據(jù)的可靠性。如果不指定,默認(rèn)情況下,副本數(shù)量為3。通過屬性dfs.replication來修改,放在hdfs-site.xml文件中
2. 在HDFS中,如果沒有開啟機(jī)架感知策略,那么默認(rèn)也不會(huì)開啟副本放置策略,那么此時(shí)多個(gè)副本是放在相對(duì)空閑的節(jié)點(diǎn)上
3. 如果啟用了機(jī)架感知策略,那么對(duì)應(yīng)的,HDFS也會(huì)啟用副本放置策略。
a. 第一個(gè)副本:如果是集群內(nèi)上傳,則誰上傳就放在誰身上;如果是集群外上傳,則誰空閑就放在誰身上。
b. 第二個(gè)副本:放在和第一個(gè)副本相同機(jī)架的節(jié)點(diǎn)上。實(shí)際過程中,會(huì)考慮將同一個(gè)物理機(jī)架上的節(jié)點(diǎn)配置在同一個(gè)邏輯機(jī)架上,此時(shí)機(jī)架內(nèi)傳輸會(huì)比跨機(jī)架傳輸要快一些。
c. 第三個(gè)副本:放在和第二個(gè)副本不同機(jī)架的節(jié)點(diǎn)上,保證不會(huì)因?yàn)橐粋€(gè)機(jī)架整體出現(xiàn)故障導(dǎo)致數(shù)據(jù)產(chǎn)生丟失。
d. 更多副本:誰空閑放在誰身上。
8.?常見命令
命令 | 解釋 |
start-dfs.sh | 啟動(dòng)HDFS |
stop-dfs.sh | 結(jié)束HDFS |
hdfs --daemon start namenode | 啟動(dòng)NameNode |
hdfs --daemon start datanode | 啟動(dòng)DataNode |
hdfs --daemon start secondarynamenode | 啟動(dòng)SecondaryNameNode |
hadoop fs -put /home/a.txt / 或者 hadoopfs -copyFromLocal /home/a.txt / | 上傳文件 |
hadoop fs -get /a.txt /home 或者 hadoop fs -copyToLocal /a.txt /home | 下載文件 |
?hadoop fs -mkdir /txt | 創(chuàng)建目錄 |
hadoop fs -mkdir -p /video/movie | 創(chuàng)建多級(jí)目錄 |
hadoop fs -rm /b.txt | 刪除文件 |
hadoop fs -rmdir /txt | 刪除目錄 |
hadoop fs -rm -r /video | 遞歸刪除目錄 |
hadoop fs -cat /c.txt | 查看文件內(nèi)容 |
hadoop fs -tail /c.txt | 查看文件最后1000個(gè)字節(jié)的數(shù)據(jù) |
hadoop fs -mv /c.txt /a.txt | 重命名或者剪切 |
hadoop fs -cp /txt/a.txt /a.txt | 復(fù)制文件 |
hadoop fs -ls / | 查看子文件或者子目錄 |
hadoop fs -ls -R / | 遞歸查看 |
hadoop fs -setrep 3 /a.txt | 設(shè)置副本數(shù)量 |
hadoop fs -chmod 777 /a.txt | 更改權(quán)限 |
hadoop fs -chown tom /a.txt | 更改用戶 |
hadoop fs -chgrp tedu /a.txt | 更改用戶組 |
9. 回收站機(jī)制
1. 在HDFS中,回收站機(jī)制默認(rèn)是不開啟的,此時(shí)刪除命令會(huì)立即生效,且該操作此時(shí)不可逆。
2. 配置回收站策略,配置在cores-site.xml中。
<!--表示指定文件在回收站中的存放時(shí)間,單位是min-->
<!--如果超過指定的時(shí)間,依然沒有將文件從回收站中還原回來-->
<!--回收站就會(huì)認(rèn)為此時(shí)文件已經(jīng)失效,就會(huì)清理掉-->
<!--如果不指定,那么此屬性的值默認(rèn)為0-->
<property>
??????? <name>fs.trash.interval</name>
??????? <value>1440</value>
</property>
3. 回收站的默認(rèn)存放位置為/user/root/.Trash/Current/。
4. 如果需要將文件從回收站中還原回來,那么使用hadoop fs -mv命令即可。
三、流程
1.?寫(上傳)流程
1. 客戶端發(fā)起RPC請(qǐng)求到NameNode,請(qǐng)求上傳文件。
2. 當(dāng)NameNode收到請(qǐng)求之后,會(huì)先進(jìn)行校驗(yàn):
a. 校驗(yàn)是否有指定路徑 - FileNotFoundException。
b. 校驗(yàn)是否有寫入權(quán)限 - AccessControlException。
c. 校驗(yàn)是否有同名文件 - FileAlreadyExistException。
3. 如果校驗(yàn)失敗,則直接報(bào)錯(cuò);如果校驗(yàn)成功,則NameNode會(huì)給客戶端返回信號(hào)表示允許上傳。
4. 當(dāng)客戶端收到信號(hào)之后,會(huì)再次給NameNode來發(fā)送請(qǐng)求,請(qǐng)求獲取第一個(gè)Block的存儲(chǔ)位置。
5. NameNode收到請(qǐng)求之后,會(huì)將這個(gè)Block的存儲(chǔ)位置(實(shí)際上是DataNode的IP或者主機(jī)名,默認(rèn)情況下會(huì)返回3個(gè)存儲(chǔ)位置 - 副本數(shù)量為3)返回給客戶端。
6. 客戶端收到存儲(chǔ)位置之后,會(huì)從這些地址中選取一個(gè)較近(實(shí)際上是網(wǎng)絡(luò)拓?fù)渚嚯x)的地址,發(fā)送請(qǐng)求,請(qǐng)求建立pipeline(管道,實(shí)際上是基于NIO Channel)用于傳輸數(shù)據(jù);第一個(gè)Block所在節(jié)點(diǎn)會(huì)給下一個(gè)Block所在的節(jié)點(diǎn)發(fā)送請(qǐng)求,請(qǐng)求建立pipeline;依此類推,直到最后一個(gè)請(qǐng)求應(yīng)答成功。
7. 建立好管道應(yīng)答成功之后,客戶端會(huì)將當(dāng)前的Block進(jìn)行封包,將Packet寫入第一個(gè)節(jié)點(diǎn);寫完之后,第一個(gè)Block所在的節(jié)點(diǎn)寫入第二個(gè)節(jié)點(diǎn),依次類推。
8. 當(dāng)這個(gè)Block的所有副本寫完之后,客戶端會(huì)再次給NameNode發(fā)送請(qǐng)求,請(qǐng)求獲取下一個(gè)Block的存儲(chǔ)位置,重復(fù)5.6.7.8四個(gè)步驟,直到所有的Block全部寫完。
9. 當(dāng)客戶端寫完所有的Block之后,會(huì)給NameNode發(fā)送一個(gè)請(qǐng)求,請(qǐng)求關(guān)閉文件(關(guān)流)。文件一旦關(guān)閉,數(shù)據(jù)就不能修改。
2.?讀(下載)流程
1. 客戶端發(fā)起RPC請(qǐng)求到NameNode,請(qǐng)求下載文件。
2. NameNode收到請(qǐng)求之后,會(huì)先進(jìn)行校驗(yàn):
a. 校驗(yàn)是否有讀取權(quán)限 - AccessControlException。
b. 校驗(yàn)是否有指定文件 - FileNotFoundException。
3. 如果校驗(yàn)失敗,會(huì)直接報(bào)錯(cuò);如果校驗(yàn)成功,則NameNode就會(huì)給客戶端返回一個(gè)信號(hào)表示允許讀取。
4. 客戶端收到信號(hào)之后,會(huì)再次發(fā)送請(qǐng)求給NameNode,請(qǐng)求獲取第一個(gè)Block的存儲(chǔ)位置。
5. NameNode收到請(qǐng)求之后,會(huì)查詢?cè)獢?shù)據(jù),然后將這個(gè)Block的存儲(chǔ)地址(默認(rèn)情況下是3個(gè))返回給客戶端。
6. 客戶端收到地址之后,會(huì)從這些地址中選取一個(gè)較近的地址來讀取這個(gè)Block。
7. 讀取完這個(gè)Block之后,客戶端會(huì)對(duì)這個(gè)Block進(jìn)行checkSum校驗(yàn)。如果校驗(yàn)失敗,說明這個(gè)Block產(chǎn)生了變動(dòng),此時(shí)客戶端會(huì)從剩余的地址中重新選取一個(gè)地址重新讀取重新校驗(yàn);如果校驗(yàn)成功,則客戶端會(huì)再次給NameNode發(fā)送請(qǐng)求,請(qǐng)求獲取下一個(gè)Block的存儲(chǔ)位置,重復(fù)5.6.7三個(gè)步驟,直到讀取完所有的Block。
8. 當(dāng)客戶端讀取完最后一個(gè)Block之后,會(huì)給NameNode發(fā)送一個(gè)結(jié)束信號(hào)。NameNode收到信號(hào)之后會(huì)關(guān)閉這個(gè)文件。
3.?刪除流程
1. 客戶端發(fā)起RPC請(qǐng)求到NameNode,請(qǐng)求刪除文件。
2. NameNode收到請(qǐng)求之后,會(huì)先進(jìn)行校驗(yàn):
a. 校驗(yàn)是否有刪除權(quán)限 - AccessControlException。
b. 校驗(yàn)是否有指定文件 - FileNotFoundException。
3. 如果校驗(yàn)失敗,則直接報(bào)錯(cuò);如果校驗(yàn)成功,則NameNode會(huì)將這個(gè)寫請(qǐng)求記錄到edits_inprogress文件中,記錄成功之后,會(huì)修改內(nèi)存中的元數(shù)據(jù);修改完成之后,NameNode會(huì)給客戶端返回一個(gè)ACK信號(hào)表示刪除成功。需要注意的是,此時(shí)文件并沒有真正從HDFS上移除,僅僅是修改了元數(shù)據(jù)。
4. NameNode給客戶端返回信號(hào)之后,就會(huì)等待DataNode的心跳。NameNode在收到DataNode的心跳之后,會(huì)在心跳響應(yīng)中要求DataNode刪除對(duì)應(yīng)的Block。
5. DataNode在收到心跳響應(yīng)之后,會(huì)按照NameNode的要求,去磁盤上刪除文件對(duì)應(yīng)的Block。注意,此時(shí)文件才真正的從HDFS上移除。