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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97