我們可以用Java Api寫代碼進(jìn)行復(fù)制文件或目錄,也可以使用hadoop fs -cp進(jìn)行復(fù)制,可這兩種效率并不高,拷貝文件或目錄寫代碼也麻煩。使用distcp并行處理是比較好的手段。
命令
復(fù)制文件
hadoop distcp file1 file2
復(fù)制目錄
hadoop distcp dir1 dir2
如果dir2不存在,將新建dir2,目錄dir1的內(nèi)容全部復(fù)制到dir2下??梢灾付ǘ鄠€(gè)源路徑,所有源路徑下的內(nèi)容都將被復(fù)制到目標(biāo)路徑下。
如果dir2已經(jīng)存在,那么目錄dir1將被復(fù)制到dir2下,形成目錄結(jié)構(gòu)dir2/dir1。也可以添加-overwrite選項(xiàng),在保持目錄結(jié)構(gòu)的同時(shí)強(qiáng)制覆蓋原文件。
hadoop distcp -overwrite dir1 dir2
也可以使用-update選項(xiàng),僅更新發(fā)生變化的文件。
hadoop distcp -update dir1 dir2
在HDFS集群間傳遞數(shù)據(jù)
hadoop distcp -update -delete -p hdfs://namenode1/foo hdfs://namenode2/foo
以上命令在第二個(gè)集群上為第一個(gè)集群的/foo目錄創(chuàng)建一個(gè)備份。
-delete選項(xiàng)允許刪除目標(biāo)路徑中任意沒在源路徑中出現(xiàn)的文件或目錄。
-p選項(xiàng)設(shè)置文件的狀態(tài)屬性被保留,如權(quán)限、塊大小和副本數(shù)。
如果兩個(gè)集群運(yùn)行的HDFS版本不兼容,可以使用webhdfs進(jìn)行distcp:
hadoop distcp webhdfs://namenode1:50070/foo webhdfs://namenode2:50070/foo
原理
distcp是作為一個(gè)MapReduce作業(yè)來實(shí)現(xiàn)的,通過在集群中并行運(yùn)行的map來完成,這里沒有reduce階段。默認(rèn)情況下,會(huì)啟動(dòng)20個(gè)map任務(wù),但是可以通過distcp指定-m參數(shù)來修改map數(shù)目。