Hadoop學習——hdfs上傳讀取刪除檔案的過程
Hadoop學習——hdfs上傳讀取刪除檔案的過程
- namnode,名位元組點,最主要管理HDFS的元資料資訊。
- datanode,資料節點,儲存檔案塊
- replication,檔案塊的副本,目的是確保資料儲存的可靠性
- rack 機器
- Client 客戶端。凡是通過指令或程式碼操作的一端都是客戶端
- Client 的Read(從HDFS下載檔案到本地)
- Client的Write(上傳檔案到HDFS上)
從HDFS上讀取檔案的過程
-
客戶端發起
open File
,目的是獲取要下載的檔案的輸入流。
namenode
-
客戶端在發起
open file
的同時,還會呼叫getblockLocation
。當第一步監測都通過之後,namenode
會將元資料資訊全部或者部分封裝到輸入流
中,返回給客戶端。 -
客戶端用
輸入流
,根據元資料資訊,去指定的datanode
讀取檔案塊,一般去最近的節點上獲取資料。(按照blockid
的順序讀取)。之所以不是namenode
來拿資料返回給datanode
,而是客戶端自己去找,是因為namenode
僅有一個,會有單點問題,減少了namenode
的壓力。 -
同上。如果沒有讀完,則仍舊請求
namenode
,去要下一個塊的資訊。 -
檔案下載完成後關閉連線。
-
讀取每個塊的過程中會有校驗的過程,校驗不一致,則通知
namenode
。重新讀取。
1、校驗是在傳送資料前將資料通過MD5算出一個唯一標識碼,
並將該標識碼隨資料包一起傳送給客戶端。
2、客戶端收到資料後也以同樣方式算出一個標識碼,兩者進行比較,
如果不同,則表示檔案傳輸缺失。
HDFS上傳檔案的過程
- 客戶端發起
create file
請求,目的是獲取hdfs
檔案的輸出流。namenode
收到請求後會檢測路徑的合法性,以及許可權。原生Hadoop
許可權管理不是很完善,工作中用的是cdh
(商業版hadoop
- 如果檢測都通過,
namenode
會為這個檔案生成塊的元資料資訊(比如檔案切塊
、分配塊id
、分配每個塊存在哪個datanode
上),然後將該資訊返回給客戶端。 - 客戶端拿出輸出流之後,採用
pipeline
(資料流管道)機制做資料的傳送。副本一般都是3個,但是為什麼在拷貝中是一個datanode
,然後在datanode
之間線性傳輸,而不是一次給三個datanode
那樣拓撲式傳輸呢?這樣的資料以管道的方式,順序的沿著一個datanode
傳輸,這樣能夠充分利用每個機器的頻寬,避免網路瓶頸和高延遲時的連線,最小化推送所有資料的延時。線上性推送模式下,每臺機器所有的出口寬頻都用於以最快的速度傳輸資料,而不是在多個接受者之間分配寬頻。
packet
是一個64kb
大小的資料包,即客戶端在傳送檔案塊時,會把檔案打散成一個個的資料包,傳送給datanode
。
4.5 每臺datanode
收到packet
後,會向上遊datanode
做ack
確認,如果接受失敗,會進行重發。
6.當一個檔案上傳完後,關流。
HDFS刪除檔案的過程
- 當客戶端發起一個刪除指令
hadoop fs -rm /park01/1.txt
,這個指令會傳給namenode
。 - 當
namenode
收到指令後,做路徑和許可權檢測,如果檢測都通過,會將對應的檔案資訊從記憶體中刪除。此時,檔案資料並不是馬上就從叢集上被刪除。 datanode
向namenode
傳送心跳時,會領取刪除指令,然後從磁碟上將檔案刪除。
hdfs讀取檔案的原始碼分析
DFSClicent
類,利用ClientProtocol
這個介面,通過rpc
的形式與namenode
進行通訊。ClientProtocol
裡,會呼叫namenode
的方法。
DFSInputStream
是在DFSClicent
通過ClientProtocol
介面,利用rpc
在向namenode
發起open file
命令是,namenode
會返回客戶端一個DFSInputStream
流,該流裡封裝著元資料資訊(即LocatedBlocks
l類)以及DatanodeInfo
節點資訊。客戶端再通過流中的BlockReader
去datanode
讀取資料。
hdfs上傳檔案的原始碼分析
客戶端在檔案上傳的時候發起write
請求,namenode
返回一個DFSOutputStream
輸出流。輸出流會將檔案打散成64kb
的包(Packet
),並且每個包含有一個512b
的校驗碼(DataChecksum
),然後建立一個數據佇列dataqueue
,將所有資料包加到·dataqueue
佇列中,最後啟動DataStreamer
執行緒。
上邊說過:
在打散包時,會對每個包算出一個校驗碼,在傳送過程中也將校驗碼傳送到
datanode,datanode在接受後,也會以相同邏輯算一次校驗碼,
通過自己算出來的和傳過來的校驗碼兩者是否一致,來確定資料的完整性。
DataStreamer
(後臺執行緒繼承了Daemon
)執行緒通過資料管道,將包傳送給第一個datanode
,並且將資料再放一份到一個新的佇列中ackqueue
。ackqueue
的作用在傳送失敗的時候,可以從該佇列裡恢復,確保資料的完整。
ResponseProcessor
執行緒就是專門來收集拷貝後的ack
如果失敗了之後,它會執行從ackqueue
裡取資料重新發送,如果傳送成功了。則刪除ackqueue
的資料。
注意:
ackqueue和dataque都是LinkedList<Packet>型別,Packet即是上邊的資料塊,
LinkedList的特點是無界,並且增刪快的特點。
datanode原始碼
DataNode
是一個類。
DataNodeProtocol
介面是namenode
和datanode
之間互動的介面,比如sendHeartbeat
心跳方法。
BlockerSender
是從datanode
的角度來看,它作為傳送給客戶端資料、datanode
之間傳輸資料的介面。
另外,在叢集中當資料分佈不均勻時,開啟負載均衡工具時,也會用到BlockerSender
。即hadoop
安裝目錄下sbin
目錄中的start-balancer.sh
,在執行如下命令時:
start-balancer.sh -t 10% //10%表示各節點之間資料的偏差率不能高於10%
注意該命令不是永久的,如果再填入新節點,也需要執行一下,才會有效。
ClientDatanodeProtocol
即客戶端和datanode
互動的介面。