分布式拷贝工具distCp使用指南:
模块名称 | Hadoop V2 对外标准文档 |
所属系统 | sys/sos |
模块负责人 | |
文档提交日期 | |
背景及介绍:
为了适应大规模集之间数据传输的需要:需要有一种工具能满足在短时间传输文件数据量大,文件数量多,且必须有一种机制保证两个集数据的一致,即使出现某一个文件传输错误,并且还会有重试机制来保证数据正确。
DistCp(分布式拷贝)是用于大规模集内部和集之间拷贝的工具。它使用方便,传输高效,并且能错误处理和断点续传。它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。
使用说明:
Distcp通过hadoop shell接口启动,命令参数如下,srcurl可以
distcp [OPTIONS] <srcurl>* <desturl>
OPTIONS:
-p[rbugp] Preserve status
r: replication number
b: block size
u: user
g: group
p: permission
-p alone is equivalent to -prbugp
-i Ignore failures
-log <logdir> Write logs to <logdir>
-m <num_maps> Maximum number of simultaneous copies
-overwrite Overwrite destination
-update Overwrite if src size different from dst size
-f <urilist_uri> Use list at <urilist_uri> as src list
-filelimit <n> Limit the total number of files to be <= n
-sizelimit <n> Limit the total size to be <= n bytes
-delete Delete the files existing in the dst but not in src
常用参数解释:
-
p参数是保留dst文件的权限位是否与src集的文件权限位一致,若不加此选项则在dst集上生成的文件的权限信息将于distcp的ugi信息一致。
-i 若在拷贝的过程中出现错误,则忽略此错误,否则就会进行4次重试直到整个任务失败。
-m 设置最大的map数,非capacity
-overwrite 将强行覆盖dst目录中和src重名的文件
-update 将比较同名文件大小,若不一致则覆盖
-f 可以将带传输的文件或目录写到平台上存放的一个文件中,多目录可以采用这种方式
-filelimit 和 –sizelimit 是限制传输的文件数和大小,感觉用途不大
注意事项:(Dist-cp计算成功必要条件)
在src启动dist-cp,其ugi必须与dst的ugi一样(用户名及密码一样)
这里的ugi是指启动distcp对应客户端的ugi信息必须在源集和目的集一样。由于hadoop
官方是没有ugi认证的特性,dist-cp对源集和目的集都只会用启动时的配置去连接,而在sos发布的hadoop-v2中有了权限认证,如果源集和目的集的ugi不一致,则dist-cp无法同时成功连接2个集,所以会报出“the user is not authorized”的错误。
src的ugi需对src的目录及其下面得文件全部有读权限,可以不是同一个用户;
对源集的src文件必须可以保证读操作,否则dist-cp就会失败
dst的ugi需对dst的目录下有可执行权限,可以不是同一个用户。
对目的集的文件夹也必须是可以保证写权限,否则dist-cp就会失败
若带上-p选项,则dst的ugi必须能将文件chown成src文件对应的属性的能力。
-p选项是保留源文件的属性,默认的创建文件的属性是和dist-cp的ugi信息一致的。若带上此选项则在文件传输后将调用chown和chmod命令将其源文件的属性。但是,若distcp的ugi用户没有权限在dst集上操作的话,则此选项无效。
实际例子:
●拷贝jx集数据到yx集:
./hadoop distcp "hdfs://jx-spi-test9.jx.baidu:64310/user/test/input" "hdfs://01.baidu:64310/user/test/input"
将jx集的/user/test/input目录下的文件及目录拷贝到yx集的/user/test/input目录下。由于jx和yx集的namenode的服务端口设为64310,所以此处也必须保持一致。
注意:
1)若jx的/user/test/input是文件而不是目录,并且yx集不存在/user/test/input不存在,则将拷贝到yx的是/user/test/input文件。
2)反之不满足情况1),并且yx的/user/test/input目录不存在,则将拷贝的是/user/test/input这个目录。
3)反之不满足情况1),并且yx的/user/test/input目录存在,则将拷贝的是/user/test/input/input这个目录。
4)若源目录和目的目录下存在相同的文件,则计算会失败,这种情况就需要采用-update或-overwrite方式
另外,本地集(启动distcp的集)可以不用hdfs开头 直接写平台路径即可。
即如果在jx一台客户端上运行distcp可以写成这样:
./hadoop distcp -update "/user/test/input" "hdfs://01.baidu:64310/user/test/input"
●拷贝多个集的输入到yx集
./hadoop distcp "hdfs://jx-spi-test9.jx.baidu:64310/user/test/input" “hdfs://ai-logpf-master3-v.ai01:54310/user/test/input2”"hdfs://01.baidu:64310/user/test/input"
将多个集的指定目录下的文件拷贝到yx集,若多个源集指定目录下的文件存在一样的则计算是失败的。
●采用更新方式(-update)拷贝jx集数据到yx集:
./hadoop distcp -update "hdfs://jx-spi-test9.jx.baidu:64310/user/test/input" "hdfs://01.baidu:64310/user/test/input"
将jx集的/user/test/input目录下的文件及目录拷贝到yx集的/user/test/input目录下,若yx集目的目录下存在同名文件则比较大小,若不一样则覆盖掉yx集上的文件。
●采用覆盖方式(-overwrite)拷贝jx集数据到yx集:
./hadoop distcp -overwrite "hdfs://jx-spi-test9.jx.baidu:64310/user/test/input" "hdfs://01.baidu:64310/user/test/input"
将jx集的/user/test/input目录下的文件及目录拷贝到yx集的/user/test/input目录下,若yx集目的目录下存在同名文件则直接覆盖掉yx集上的文件。
●保留源文件属性:
./hadoop distcp -prug "hdfs://jx-spi-test9.jx.baidu:64310/user/test/input" "hdfs://yx-ma
01.baidu:64310/user/test/input"
将jx集的/user/test/input目录下的文件及目录拷贝到yx集的/user/test/input目录下,拷贝完毕后将yx上的/user/test/input文件副本(r),用户(u),组(g)设置为和jx集对应文件一致。
注意:
运行distcp的ugi账户必须对目的集即yx集有root权限,可以将其chown和chmod为jx集对应的属性。
如果未设置-p选项,则生成的文件将是启动distcp的ugi属性。副本数将是/user/test/input的默认副本数。
若只设置-p参数,则是所有属性都保持一致,即等于-prbugp,其中r:副本数,b:块大小;u:用户;g:组;p:权限。
●忽略传输失败:
.
/hadoop distcp -i "hdfs://jx-spi-test9.jx.baidu:64310/user/test/input" "hdfs://01.baidu:64310/user/test/input"
如果没有加入-i选项,则若有文件传输失败,则后续的文件接着处理,但返回tasktracker失败,因而会在其它tasktracker重试,重试4次则整个计算失败。
若加入-i,则即使遇到传输失败也会返回成功,因而不在其它tasktracker重试。整个计算返回成功。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论