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