Hadoop distcp命令(一)

因为工作中涉及到了不同集群之间的数据拷贝问题,所以翻看了官方文档,为了能更好的吸收,特此将文档翻译如下。

Hadoop distcp命令(二)
Hadoop distcp命令(三)

distcp 分布式拷贝

一、总览

DistCp (分布式拷贝)是一个用来进行数据拷贝的工具,不同的是,这个命令通常是在大规模集群内部和大规模集群之间使用。DistCp命令的拷贝过程本质依然是MapReduce任务,它通过MR的方式来实现拷贝过程中的数据分发、错误处理以及报告。

该命令将文件和目录的列表作为map任务的输入,每个map任务都会复制原列表中指定路径下的文件。

早期版本的DistCp在用法、扩展性和性能上还存在一些不足,因此新版本对其进行了重构。此外新版本引入了新的规范,该命令的运行时和设置性能得到了提升,但是默认行为依然为旧规范。

该文档的目的是描述新版本DistCp的设计、新的特点、最佳实践以及与之前版本的不同。

二、使用

2.1 基础使用

DistCp命令最常用的调用方式是在集群之间进行数据拷贝:

hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo

该命令会将nn1/foo/bar目录扩展为一个临时文件,并将其中的内容分配给不同的map任务,并在nn1nn2上的nodemanager上启动copy任务。

同时也可以在命令行中配置多个源目录:

hadoop disctp hdfs://nn1:8020/foo/a \ 
              hdfs://nn1:8020/foo/b \
              hdfs://nn2:8020/bar/foo

或者也可以使用-f参数从文件中读入源目录:

hadoop distcp -f hdfs://nn1:8020/srclist \
                 hdfs://nn2:8020/bar/foo

srclist文件中的内容为:

hdfs://nn1:8020/foo/a
hdfs://nn1:8020/foo/b

当从多个原路径进行复制的时候,如果出现了路径冲突,DistCp会停止当前的拷贝任务并打印一条错误信息,冲突可以通过命令的特定选项解决。默认情况下已经存在目标集群上的文件会被跳过(不会被源文件替换)。任务结束时会报告跳过的文件数,但是如果复制任务在文件的某些子集上失败了,并在之后的尝试中又成功的话,这个数据可能会不准确。

数据复制过程中很重要的一点是,需要保证NodeManager能够连接目标文件系统和源文件系统并且保持通信。对于HDFS而言,源系统和目标系统必须运行相同的版本或者版本可以向下兼容。[不同版本间的文件拷贝参考附录][ 1]。

复制之后,建议生成一个用来交叉验证源和目标的列表,检查复制是否真的成功了。因为DistCp同时使用了Map/Reduce和FileSystem的API,这三个部分中的任何一个出现问题都会对复制过程产生破坏性的,无法追溯的影响。一些情况下利用-update参数可以在第二遍copy时成功执行,但是使用者需要在使用该参数之前搞清楚具体的含义。

需要注意的是,如果另一个客户端在向源文件写入内容时,整个复制过程也会失败。尝试在HDFS上复写一个已经在目标路径写入的文件也应该失败。如果源文件在复制之前被删除了,复制过程会报FileNotFoundException

2.2 更新和复写

-update是用从源路径复制目标路径没有的或者与目标路径下版本不同的文件。

-overwrite用来复写在目标路径下已经存在的文件。

update和overwrite选项需要特别注意,因为他们处理源路径的方式默认方式有一些细微的差别。考虑从/source/first/source/second/ 拷贝文件到/target/,源路径下包括以下内容:

hdfs://nn1:8020/source/first/1
hdfs://nn1:8020/source/first/2
hdfs://nn1:8020/source/second/10
hdfs://nn1:8020/source/second/20

如果调用DistCp命令时没有加-update或者-overwrite参数,DistCp命令默认情况下会在/target目录下创建first/ 和 second/ 目录。因此以下命令:

distcp hdfs://nn1:8020/source/first  \
       hdfs://nn1:8020/source/second \
       hdfs://nn2:8020/target

会在/target目录下产生以下内容:

hdfs://nn2:8020/target/first/1
hdfs://nn2:8020/target/first/2
hdfs://nn2:8020/target/second/10
hdfs://nn2:8020/target/second/20

而当加入了-update参数或者-overwrite参数时,只会将源路径下的内容拷贝到目标路径下,并不会创建源路径的目录,因此:

distcp -update hdfs://nn1:8020/source/first  \
               hdfs://nn1:8020/source/second \
               hdfs://nn2:8020/target

将会在目标路径/target下创建如下内容:

hdfs://nn2:8020/target/1
hdfs://nn2:8020/target/2
hdfs://nn2:8020/target/10
hdfs://nn2:8020/target/20

通过扩展,如果两个源文件夹包含了相同名称的文件,那么两个源文件都会映射到目标文件夹下,这样就会产生冲突,而DistCp会阻止这种情况产生。

接下来看这个例子:

distcp hdfs://nn1:8020/source/first  \
       hdfs://nn1:8020/source/second \
       hdfs://nn2:8020/target

源文件的目录及文件大小

hdfs://nn1:8020/source/first/1 32
hdfs://nn1:8020/source/first/2 32
hdfs://nn1:8020/source/second/10 64
hdfs://nn1:8020/source/second/20 32

目标文件夹目录及文件大小

hdfs://nn2:8020/source/first/1 32
hdfs://nn2:8020/source/second/10 32
hdfs://nn2:8020/source/second/20 64

执行命令之后,目标文件夹目录

hdfs://nn2:8020/target/1 32
hdfs://nn2:8020/target/2 32
hdfs://nn2:8020/target/10 64
hdfs://nn2:8020/target/20 32

可以看到1被跳过了,因为文件长度和内容都匹配;2是复制过来的,因为目标路径下没有这个文件;10和20被复写了,因为文件长度不匹配。

如果使用了-update参数,那么1也会被复写。

在这里插入图片描述

这是鄙人的公众号,会第一时间在上面更新与大数据相关的文章。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值