資料複制(Data Replication)
HDFS
旨在跨大型叢集中的計算機可靠地存儲非常大的檔案。它将每個檔案存儲為一系列塊,除最後一個塊之外的檔案中的所有塊都具有相同的大小,
HDFS
使用的預設塊大小為
128MB
。複制檔案的塊以實作容錯,且一般複制出的檔案塊會存儲到不同的
DataNode
中。每個檔案的
Block
大小和
Replication
因子都是可配置的。。
Replication
因子在檔案建立的時候會預設讀取用戶端的
HDFS
配置,然後建立(可改變)
中的檔案是
HDFS
,并且嚴格要求在任何時候隻有一個
write-one
writer
HDFS
資料備援複制如圖所示。

從圖可以看到,檔案
/user/nuoline/data/part-1
的複制因子
Replication
值是
2
,塊的
ID
清單包括
{1,3}
,可以看到塊1和塊3分别被備援備份了兩份資料塊;
檔案
/user/nuoline/data/part-2
的複制因子
Replication
值是
3
,塊的ID清單包括2、4、5,可以看到塊
{2,4,5}
分别被備援複制了三份。
在中,
HDFS
做着有關塊複制的所有決定,它定期從群集中的每個
NameNode
接收
DataNode
和
Heartbeat
。心跳包(
Blockreport
)的接收表示該
Heartbeat
節點正常工作,而
DataNode
包括了該
Blockreport
上所有的
DataNode
組成的清單
Block
資料複制流水線
當用戶端将資料寫入複制因子為
r = 3
的
HDFS
檔案時,
NameNode
使用
replication target choosing algorithm
檢索
DataNode
清單。此清單包含将承載該塊副本的
DataNode
。
然後用戶端向第一個
DataNode
寫入,第一個
DataNode
開始分批接收資料,将每個部分寫入其本地存儲,并将該部分傳輸到清單中的第二個
DataNode
。第二個
DataNode
又開始接收資料塊的每個部分,将該部分寫入其存儲,然後将該部分重新整理到第三個
DataNode
。最後,第三個
DataNode
将資料寫入其本地存儲。
可見,
DataNode
是從流水線中的前一個接收資料,同時将資料轉發到流水線中的下一個,資料是從一個
DataNode
流水線到下一個
DataNode
。
操作命名
應用可以以多種方式操控 HDFS 上的檔案,其中通過 FS Shell 可以像操控 Linux 檔案系統一般,常用指令有:
hdfs dfs -cp /user/merge /user/search
上面的指令将merge檔案下面的所有檔案(包括merge檔案夾)複制到search目錄下。
Action | Command |
---|---|
建立 foodir 檔案夾 | bin/hadoop fs -mkdir /foodir |
删除檔案夾 | bin/hadoop fs -rm -R /foodir |
檢視檔案内容 | bin/hdfs dfs -cat /foodir/myfile.txt |
上傳檔案 | bin/hdfs dfs -copyFromLocal ~/a.txt /foodir/ |
…… | …… |
會發現這裡有兩種指令字首,一個是 hadoop fs,一個是 hdfs dfs
差別是:hadoop fs 可以用于其他檔案系統,不止是hdfs檔案系統内,也就是說該指令的使用範圍更廣;而 hdfs dfs 專門針對hdfs分布式檔案系統。
還有一個字首為 hadoop dfs,這個已經過時,建議不要使用。
參考文獻
Hadoop:HDFS的資料複制