引言
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