最近公司集群切換,需要將老集群中的資料遷移到新集群上,了解到了distcp這個工具。借助它很好的完成了遷移任務。
基礎用法如下:
hadoop distcp hdfs://cluster1:9000/stat hdfs://cluster2:9000/這裡就是把cluster1中的stat拷貝到cluster2中,這裡需要注意源路徑和目標路徑均要寫絕對路徑。
另外,如果源路徑較多,可以將原路徑寫到乙個文字中,然後通過:
hadoop distcp -f hdfs://nn1:8020/srclist hdfs://nn2:8020/destination其中srclist中存的就是多個原路徑的絕對路徑。
以上只是最簡單的用法,具體還有一些相關引數可以進行設定,如:
標識 描述 備註
-p [rbugp] preserve
r:replication number
b: block size
u: user
g: group
p: permission
-i 忽略失敗 這個選項會比預設情況提供關於拷貝的更精確的統計,
-log 記錄日誌到
-m 指定了拷貝資料時map的數目。請注意並不是map數越多吞吐量越大。
-overwrite 覆蓋目標 如果目標路徑有內容會直接覆蓋。
-update 如果源和目標的大小不一樣則進行覆蓋
-f 用 作為原始檔列表 這等價於把所有檔案名列在命令列中。 urilist_uri 列表應該是完整合法的uri。由於官網介紹有說道,在應用執行遷移資料過程中,如果有客戶端同時在往原始檔中寫資料,則很有可能會導致應用執行失敗,而我們的集群環境中原始檔就有可能會在拷貝時有客戶端往hdfs上寫資料,對此如果拷貝的時候需要自己選擇好最小拷貝目錄粒度,這樣可以防止出現以上問題,我們線上資料是按天來分割的,一般只會修改當天資料,所以我會對某類一級目錄下,按天劃分為乙個個小的任務目錄,對每一天的資料執行distcp,從而避免失敗。
本人是使用指令碼實現的,我的指令碼如下:
#!/bin/sh
# 由於distcp在遷移時,如果有客戶端在往源路徑下寫入資料,很可能會導致資料遷移失敗,為此要對遷移的資料進行二級目錄(時間)級別遷移。
# 入參就是根目錄「/」下的檔名 源:hdfs://cluster1:9000/$1/sub*** 目標:hdfs://cluster2:9000/$1
# 指令碼在225這台老的nn上執行
orig=$1 #orig=/stat
filter=$2
sourcepath= #sourcepath=hdfs://cluster1:9000/stat/20180712
destpath= #destpath=hdfs://cluster2:9000/stat
destrootpath=
#以防拷貝中途出現主備切換的情況,找到active的namenode
getsourcepath()
getdestpath()
oldifs="$ifs"
ifs=$'\n'
for line in `hadoop fs -du $orig|grep $filter`
do subpath=`echo $line|awk ''` #subpath=/stat/20180712
filename=`echo $subpath|awk -f "/" ''` #filename=20180712
getsourcepath $subpath
getdestpath $orig
echo "from $sourcepath to $destpath"
#-update引數會校驗源路徑下檔案和目標處檔案大小是否一樣,不一樣就會覆蓋,
#一樣就會跳過執行,這樣如果第二次執行時可以跳過已經拷貝完成的內容 -need test!
hadoop distcp -m 300 $sourcepath $destpath
#對遷移完的檔案進行校驗,比較大小是否一樣
localsize=`hadoop fs -du $orig|grep $filename`
remotesize=`hadoop fs -du $destrootpath$orig|grep $filename`
if [ $localsize -eq $remotesize ];then
echo "$subpath validate ok!"
else
echo "$subpath copy error!"
fidone
Hadoop資料遷移 distcp 工具
hadoop distcp 備份hdfs檔案,並行複製大量資料。1.同版本集群之間複製 hadoop distcp hdfs namenode1 src hdfs namenode2 dist這將從第乙個集群中複製 src目錄下的內容複製到第二個集群中的 dist目錄下 預設情況下,distcp會跳...
Hadoop集群間資料拷貝distcp使用
distcp是hadoop集群間拷貝工具,使用mapreduce的方式,進行大資料在集群的拷貝,不同於簡單的資料copy,distcp會校驗資料,穩定傳輸,最後進行拷貝結果統計,彙總拷貝狀態,如拷貝成功的檔案數 大小等 基本命令 hadoop distcp option src dst 關於dist...
Hadoop集群間資料拷貝distcp使用
distcp是hadoop集群間拷貝工具,使用mapreduce的方式,進行大資料在集群的拷貝,不同於簡單的資料copy,distcp會校驗資料,穩定傳輸,最後進行拷貝結果統計,彙總拷貝狀態,如拷貝成功的檔案數 大小等 基本命令 hadoop distcp option src dst 關於dist...