(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) 执行输出
- [[email protected]/* */ 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 或目录
来源: http://www.bubuko.com/infodetail-2281274.html