(1)discp原理
目前成都创新互联公司已为上千余家的企业提供了网站建设、域名、网站空间、网站托管、服务器托管、企业网站设计、包河网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
DistCp(Distributed Copy)是用于大规模集群内部或者集群之间的高性能拷贝工具,和在linux上执行cp,scp实现效果是一致的,不同的是,cp是将本机的文件和目录拷贝到本机的其它地方,scp则可以将A机器的文件或者目录拷贝到B机器,而Distcp则可以实现的是A(hdfs)集群的数据拷贝到B(hdfs)集群,而分布式使得数据拷贝时,可以实现A级群的DN节点同时向B集群的DN节点发送数据,突破了单机拷贝的网卡速率限制,拷贝效率更高。
同时Distcp它使用Map/Reduce任务实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。(实际上Distcp只用到了map,没用用到reduce)。
(2)使用场景
1:数据异地灾备。
2:机房下线,数据迁移。
3:数据准实时同步。
(3)discp优势
1:支持带宽限流,可以使用bandwidth参数对distcp的每个map任务限流,同时控制map并发数量即可控制整个拷贝任务的带宽,防止拷贝任务将带宽打满,影响其它业务。
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]
选项:
-p [rbugp] 状态
r:复制数
b:块大小
u:用户
g:组
p:权限
t:修改和访问时间
-p单独相当于-prbugpt
-i 忽略失败
-basedir
-log
-m
-overwrite 覆盖目的地
-update 如果src大小与dst大小不同,则覆盖
-skipcrccheck 不要使用CRC检查来确定src是否是 不同于dest。
-copybychunk 剁碎和复制的文件
-f
-filelimit
-filelimitpermap
-sizelimit
-sizelimitpermap
-delete 删除dst中存在的文件,但不在src中
-mapredSslConf
-usefastcopy 使用FastCopy(仅适用于DFS)
注1:如果设置了-overwrite或-update,则每个源URI和目标URI保持同级一致。
例如:
hadoop distcp -p -update hdfs://A:9000//home/aa hdfs://B:9000//home/bb
支持的通用选项是
-conf
-D
-fs
-jt
-jtold
-files <逗号分隔的文件列表>指定要复制到map reduce cluster的逗号分隔文件
-libjars <逗号分隔的jars列表> 指定要包含在类路径中的逗号分隔的jar文件。
-archives <逗号分隔的归档列表> 指定要在计算机上取消归档的逗号分隔的归档。
Hadoop 2版本
用法:distcp OPTIONS [source_path ...]
OPTIONS
-append 重新使用目标文件中的现有数据并追加新的如果可能,给他们的数据
-async 应该是distcp执行阻塞
-atomic 提交所有更改或无
-bandwidth
-delete 从目标中删除,源文件丢失
-diff
-f
-filelimit
-i 在复制期间忽略故障
-log
-m
-mapredSslConf
-overwrite 选择无条件覆盖目标文件,即使它们存在。
-p
(复制,块大小,用户,组,权限,校验和类型,ACL,XATTR,时间戳)
如果-p是指定为no
原始的* xattrs是源和目的地都保留路径位于/.reserved/raw层次结构中(HDF只要)。原始*
xattrpreservation是独立的-p标志。请参阅DistCp文档更多细节。
-sizelimit
-skipcrccheck 是否跳过源和源之间的CRC检查目标路径。
-strategy
-tmp
-update 更新目标,仅复制missingfiles或目录