Distcp工具深入分析

发表于:2014-06-25来源:淘测试作者:凡提点击数: 标签:软件测试
DistCp命令是hadoop用户最常使用的命令之一,它位于hadoop tools包中,代码不多,约1300多行,主要用于在两个HDFS集群之间快速拷贝数据。DistCp工具代码结构清晰易懂,通过分析该工具的代码

  引言

  DistCp命令是hadoop用户最常使用的命令之一,它位于hadoop tools包中,代码不多,约1300多行,主要用于在两个HDFS集群之间快速拷贝数据。DistCp工具代码结构清晰易懂,通过分析该工具的代码有助于我们更好的理解MR编程框架,并可以对hdfs文件系统有一个初步的了解。

  用法

  DistCp使用方法如下表所示:

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、-m、-overwrite都是常用参数,大多数情况下我们期望拷贝后数据权限保持一致,通过-p参数来完成权限一致性,拷贝并行度则由-m参数来调节。至于-overwrite往往和-delete合用,用来起到dst和src的一个diff功能。至于-update是很不靠谱的参数,因为只有当源和目标文件的大小不一致时distcp才会覆盖拷贝,如果大小一致,虽然内容不同distcp也依然会跳过这个文件不做拷贝。

  源代码与过程分析

  DistCp实现了org.apache.hadoop.util.Tool这个接口,这个接口实际只有一个有用的方法声明,即“int run(InputStream in, OutputStream out, OutputStream err,String... arguments);”通过ToolRunner这个类调度运行。

  DistCp解析完参数后,首先通过源路径检测并获得文件系统句柄。然后进入setup方法:

private static void setup(Configuration conf, JobConf jobConf,

final Arguments args)

  该方法是DistCp做准备工作的地方,首先是结合一个随机数生成一个工作目录,并将该目录路径作为参数传递给Mapper,在这个目录下会生成两个文件“_distcp_src_files”和“_distcp_dst_files”,这两个文件都是SequenceFile,即Key/Value结构的序列化文件,这里将记录所有需要拷贝的源目录/文件信息列表。其中_distcp_src_files 的key是源文件的size,如果是目录则记录为0,value是自己实现的Writable接口类FilePair,记录目标节点的org.apache.hadoop.fs.FileStatus和路径。_distcp_dst_files的key是目标路径,和节点的FileStatus。这两个文件是DistCp工具的关键点,在setup方法中,DistCp通过递归遍历了要拷贝的所有源头数据列表,生成了这两个文件。

原文转自:http://www.taobaotest.com/blogs/2516