(1)discp原理node
DistCp(Distributed Copy)是用於大規模集羣內部或者集羣之間的高性能拷貝工具,和在linux上執行cp,scp實現效果是一致的,不一樣的是,cp是將本機的文件和目錄拷貝到本機的其它地方,scp則能夠將A機器的文件或者目錄拷貝到B機器,而Distcp則能夠實現的是A(hdfs)集羣的數據拷貝到B(hdfs)集羣,而分佈式使得數據拷貝時,能夠實現A級羣的DN節點同時向B集羣的DN節點發送數據,突破了單機拷貝的網卡速率限制,拷貝效率更高。linux
同時Distcp它使用Map/Reduce任務實現文件分發,錯誤處理和恢復,以及報告生成。 它把文件和目錄的列表做爲map任務的輸入,每一個任務會完成源列表中部分文件的拷貝。(實際上Distcp只用到了map,沒用用到reduce)。bash
(2)使用場景session
1:數據異地災備。
併發
2:機房下線,數據遷移。
app
3:數據準實時同步。
curl
(3)discp優點async
1:支持帶寬限流,可使用bandwidth參數對distcp的每一個map任務限流,同時控制map併發數量便可控制整個拷貝任務的帶寬,防止拷貝任務將帶寬打滿,影響其它業務。
tcp
2:支持overwrite(覆蓋寫),update(增量寫),delete(刪除寫)等多種源和目的校驗的拷貝方式,大量數據的拷貝必然要作到數據拷貝過程當中的校驗,來保證源和目的數據的一致性。分佈式
(4)discp命令
命令格式
hadoop distcp \ -Dmapred.jobtracker.maxtasks.per.job=1800000 \ #任務最大map數(數據分紅多map任務) -Dmapred.job.max.map.running=4000 \ #最大map併發 -Ddistcp.bandwidth=150000000 \ #帶寬 -Ddfs.replication=2 \ #複製因子,兩副本 -Ddistcp.skip.dir=$skipPath \ #過濾的目錄(不拷貝的目錄) -Dmapred.map.max.attempts=9 \ #每一個task最大嘗試次數 -Dmapred.fairscheduler.pool=distcp \ #指定任務運行的pool -pugp \ #保留屬性(用戶,組,權限) -i \ #忽略失敗的task -skipcrccheck \ #忽略CRC校驗(防止源,目標集羣hdfs版本不一致致使任務失敗。) hdfs://clusterA:9000/AAA/data \ #源地址 hdfs://clusterB:9000/BBB/data #目標地址
(5)執行輸出
[work@hq distcp]$ hadoop distcp \ -Dmapred.jobtracker.maxtasks.per.job=1800000 \ -Dmapred.job.max.map.running=4000 \ -Ddistcp.bandwidth=150000000 \ -Ddfs.replication=2 \ -Dmapred.map.max.attempts=9 \ -Dmapred.fairscheduler.pool=distcp \ -pugp -i -skipcrccheck \ hdfs://clusterA:9000/AAA/data \ hdfs://clusterB:9000/BBB/data 17/06/03 17:06:38 INFO tools.DistCp: srcPaths=[hdfs://clusterA:9000/AAA/data ] 17/06/03 17:06:38 INFO tools.DistCp: destPath=hdfs://clusterB:9000/BBB/data 17/06/03 17:06:39 INFO tools.DistCp: config no skip dir 17/06/03 17:06:40 INFO tools.DistCp: sourcePathsCount=241 17/06/03 17:06:40 INFO tools.DistCp: filesToCopyCount=240 17/06/03 17:06:40 INFO tools.DistCp: bytesToCopyCount=0.0 17/06/03 17:06:40 INFO tools.DistCp: mapTasks: 1 17/06/03 17:06:40 INFO corona.SessionDriver: My serverSocketPort 36822 17/06/03 17:06:40 INFO corona.SessionDriver: My Address 10.160.115.122:36822 17/06/03 17:06:40 INFO corona.SessionDriver: Connecting to cluster manager at jobtracker:8021 17/06/03 17:06:40 INFO corona.SessionDriver: HeartbeatInterval=15000 17/06/03 17:06:40 INFO corona.SessionDriver: Got session ID job_201706031706_267270 17/06/03 17:06:40 INFO tools.DistCp: targetsize=268435456 17/06/03 17:06:40 INFO tools.DistCp: targetfiles=500 17/06/03 17:06:40 INFO corona.SessionDriver: Started session job_201706031706_267270 17/06/03 17:06:45 INFO mapred.JobClient: map 0% reduce 0% 17/06/03 17:06:59 INFO mapred.JobClient: map 3% reduce 0% 17/06/03 17:07:01 INFO mapred.JobClient: map 5% reduce 0% 17/06/03 17:07:05 INFO mapred.JobClient: map 6% reduce 0% ..... 17/06/03 17:11:15 INFO mapred.JobClient: map 97% reduce 0% 17/06/03 17:11:17 INFO mapred.JobClient: map 100% reduce 0% 17/06/03 17:11:25 INFO corona.SessionDriver: Stopping session driver
(6)主要參數
Hadoop 1版本
distcp [OPTIONS] <srcurl> * <desturl>
選項:
-p [rbugp] 狀態
r:複製數
b:塊大小
u:用戶
g:組
p:權限
t:修改和訪問時間
-p單獨至關於-prbugpt
-i 忽略失敗
-basedir <basedir> 從<srcurl>複製文件時,使用<basedir>做爲基本目錄
-log <logdir> 將日誌寫入<logdir>
-m <num_maps> 最大併發副本數
-overwrite 覆蓋目的地
-update 若是src大小與dst大小不一樣,則覆蓋
-skipcrccheck 不要使用CRC檢查來肯定src是不是 不一樣於dest。
-copybychunk 剁碎和複製的文件
-f <urilist_uri> 將<urilist_uri>中的列表用做src列表
-filelimit <n> 將文件的總數限制爲<= n
-filelimitpermap <n> 每一個地圖要複製的最大文件數
-sizelimit <n> 將總大小限制爲<= n個字節
-sizelimitpermap <n> 每一個映射要複製的最大字節數
-delete 刪除dst中存在的文件,但不在src中
-mapredSslConf <f> 映射器任務的SSL配置文件名
-usefastcopy 使用FastCopy(僅適用於DFS)
注1:若是設置了-overwrite或-update,則每一個源URI和目標URI保持同級一致。
例如:
hadoop distcp -p -update hdfs://A:9000//home/aa hdfs://B:9000//home/bb
支持的通用選項是
-conf <configuration file>指定應用程序配置文件
-D <property = value>給定屬性的使用值
-fs <local | namenode:port>指定一個namenode
-jt <local | jobtracker:port>指定jobtracker在corona上
-jtold <local | jobtracker:port>指定jobtracker在mapreduce上
-files <逗號分隔的文件列表>指定要複製到map reduce cluster的逗號分隔文件
-libjars <逗號分隔的jars列表> 指定要包含在類路徑中的逗號分隔的jar文件。
-archives <逗號分隔的歸檔列表> 指定要在計算機上取消歸檔的逗號分隔的歸檔。
Hadoop 2版本
用法:distcp OPTIONS [source_path ...] <target_path>
OPTIONS
-append 從新使用目標文件中的現有數據並追加新的若是可能,給他們的數據
-async 應該是distcp執行阻塞
-atomic 提交全部更改或無
-bandwidth <arg> 以MB爲單位指定每一個map的帶寬
-delete 從目標中刪除,源文件丟失
-diff <arg> 使用snapshot diff報告來標識源和目標之間的差別
-f <arg> 須要複製的文件列表
-filelimit <arg> (已棄用!)限制複製到<= n的文件數
-i 在複製期間忽略故障
-log <arg> DFS上的distcp執行日誌文件夾保存
-m <arg> 要用於副本的最大併發map數
-mapredSslConf <arg> 配置ssl配置文件,用於hftps://
-overwrite 選擇無條件覆蓋目標文件,即便它們存在。
-p <arg> 保留源文件狀態(rbugpcaxt)
(複製,塊大小,用戶,組,權限,校驗和類型,ACL,XATTR,時間戳)
若是-p是指定爲no <arg>,而後保留複製,塊大小,用戶,組,權限,校驗和類型和時間戳。
原始的* xattrs是源和目的地都保留路徑位於/.reserved/raw層次結構中(HDF只要)。原始*
xattrpreservation是獨立的-p標誌。請參閱DistCp文檔更多細節。
-sizelimit <arg> (已棄用!)限制複製到<= n的文件數字節
-skipcrccheck 是否跳過源和源之間的CRC檢查目標路徑。
-strategy <arg> 複製策略使用。默認是分工基於文件大小
-tmp <arg> 要用於原子的中間工做路徑承諾
-update 更新目標,僅複製missingfiles或目錄