hadoop distcp 命令

來源:互聯網
上載者:User

DistCp(分布式拷貝)是用於大規模叢集內部和叢集之間拷貝的工具。 它使用Map/Reduce實現檔案分發,錯誤處理和恢複,以及報告產生。 它把檔案和目錄的列表作為map任務的輸入,每個任務會完成源列表中部分檔案的拷貝。 由於使用了Map/Reduce方法,這個工具在語義和執行上都會有特殊的地方。 這篇文檔會為常用DistCp操作提供指南並闡述它的工作模型。 
使用方法
基本使用方法
DistCp最常用在叢集之間的拷貝:
bash$ hadoop distcp hdfs://nn1:8020/foo/bar \ 
hdfs://nn2:8020/bar/foo
這條命令會把nn1叢集的/foo/bar目錄下的所有檔案或目錄名展開並儲存到一個臨時檔案中,這些檔案內容的拷貝工作被分配給多個map任務, 然後每個TaskTracker分別執行從nn1到nn2的拷貝操作。注意DistCp使用絕對路徑進行操作。
命令列中可以指定多個來源目錄:
bash$ hadoop distcp hdfs://nn1:8020/foo/a \ 
hdfs://nn1:8020/foo/b \ 
hdfs://nn2:8020/bar/foo
或者使用-f選項,從檔案裡獲得多個源:
bash$ hadoop distcp -f hdfs://nn1:8020/srclist \ 
hdfs://nn2:8020/bar/foo
其中srclist 的內容是
hdfs://nn1:8020/foo/a 
hdfs://nn1:8020/foo/b
當從多個源拷貝時,如果兩個源衝突,DistCp會停止拷貝並提示出錯資訊, 如果在目的位置發生衝突,會根據選項設定解決。 預設情況會跳過已經存在的目標檔案(比如不用源檔案做替換操作)。每次操作結束時 都會報告跳過的檔案數目,但是如果某些拷貝操作失敗了,但在之後的嘗試成功了, 那麼報告的資訊可能不夠精確(請參考附錄)。
每個TaskTracker必須都能夠與源端和目的端檔案系統進行訪問和互動。 對於HDFS來說,源和目的端要運行相同版本的協議或者使用向下相容的協議。 (請參考不同版本間的拷貝 )。
拷貝完成後,建議產生源端和目的端檔案的列表,並交叉檢查,來確認拷貝真正成功。 因為DistCp使用Map/Reduce和檔案系統API進行操作,所以這三者或它們之間有任何問題 都會影響拷貝操作。一些Distcp命令的成功執行可以通過再次執行帶-update參數的該命令來完成, 但使用者在如此操作之前應該對該命令的文法很熟悉。
值得注意的是,當另一個用戶端同時在向源檔案寫入時,拷貝很有可能會失敗。 嘗試覆蓋HDFS上正在被寫入的檔案的操作也會失敗。 如果一個源檔案在拷貝之前被移動或刪除了,拷貝失敗同時輸出異常 FileNotFoundException。
選項
選項索引
標識 描述 備忘 
-p[rbugp] Preserve
r: replication number
b: block size
u: user
g: group
p: permission
修改次數不會被保留。並且當指定 -update 時,更新的狀態不會 被同步,除非檔案大小不同(比如檔案被重新建立)。 
-i 忽略失敗 就像在 附錄中提到的,這個選項會比預設情況提供關於拷貝的更精確的統計, 同時它還將保留失敗拷貝操作的日誌,這些日誌資訊可以用於調試。最後,如果一個map失敗了,但並沒完成所有分塊任務的嘗試,這不會導致整個作業的失敗。 
-log <logdir> 記錄日誌到 <logdir> DistCp為每個檔案的每次嘗試拷貝操作都記錄日誌,並把日誌作為map的輸出。 如果一個map失敗了,當重新執行時這個日誌不會被保留。 
-m <num_maps> 同時拷貝的最大數目 指定了拷貝資料時map的數目。請注意並不是map數越多輸送量越大。 
-overwrite 覆蓋目標 如果一個map失敗並且沒有使用-i選項,不僅僅那些拷貝失敗的檔案,這個分塊任務中的所有檔案都會被重新拷貝。 就像下面提到的,它會改變產生目標路徑的語義,所以 使用者要小心使用這個選項。 
-update 如果源和目標的大小不一樣則進行覆蓋 像之前提到的,這不是"同步"操作。 執行覆蓋的唯一標準是源檔案和目標檔案大小是否相同;如果不同,則源檔案替換目標檔案。 像 下面提到的,它也改變產生目標路徑的語義, 使用者使用要小心。 
-f <urilist_uri> 使用<urilist_uri> 作為源檔案清單 這等價於把所有檔案名稱列在命令列中。 urilist_uri 列表應該是完整合法的URI。
更新和覆蓋
這裡給出一些 -update和 -overwrite的例子。 考慮一個從/foo/a 和 /foo/b 到 /bar/foo的拷貝,源路徑包括:
hdfs://nn1:8020/foo/a 
hdfs://nn1:8020/foo/a/aa 
hdfs://nn1:8020/foo/a/ab 
hdfs://nn1:8020/foo/b 
hdfs://nn1:8020/foo/b/ba 
hdfs://nn1:8020/foo/b/ab
如果沒設定-update或 -overwrite選項, 那麼兩個源都會映射到目標端的 /bar/foo/ab。 如果設定了這兩個選項,每個來源目錄的內容都會和目標目錄的 內容 做比較。DistCp碰到這類衝突的情況會終止操作並退出。
預設情況下,/bar/foo/a 和 /bar/foo/b 目錄都會被建立,所以並不會有衝突。
現在考慮一個使用-update合法的操作:
distcp -update hdfs://nn1:8020/foo/a \ 
hdfs://nn1:8020/foo/b \ 
hdfs://nn2:8020/bar
其中源路徑/大小:
hdfs://nn1:8020/foo/a 
hdfs://nn1:8020/foo/a/aa 32 
hdfs://nn1:8020/foo/a/ab 32 
hdfs://nn1:8020/foo/b 
hdfs://nn1:8020/foo/b/ba 64 
hdfs://nn1:8020/foo/b/bb 32
和目的路徑/大小:
hdfs://nn2:8020/bar 
hdfs://nn2:8020/bar/aa 32 
hdfs://nn2:8020/bar/ba 32 
hdfs://nn2:8020/bar/bb 64
會產生:
hdfs://nn2:8020/bar 
hdfs://nn2:8020/bar/aa 32 
hdfs://nn2:8020/bar/ab 32 
hdfs://nn2:8020/bar/ba 64 
hdfs://nn2:8020/bar/bb 32
只有nn2的aa檔案沒有被覆蓋。如果指定了 -overwrite選項,所有檔案都會被覆蓋。
附錄
Map數目
DistCp會嘗試著均分需要拷貝的內容,這樣每個map拷貝差不多相等大小的內容。 但因為檔案是最小的拷貝粒度,所以配置增加同時拷貝(如map)的數目不一定會增加實際同時拷貝的數目以及總輸送量。
如果沒使用-m選項,DistCp會嘗試在調度工作時指定map的數目 為 min (total_bytes / bytes.per.map, 20 * num_task_trackers), 其中bytes.per.map預設是256MB。
建議對於長時間運行或定期啟動並執行作業,根據源和目的地組群大小、拷貝數量大小以及頻寬調整map的數目。
不同HDFS版本間的拷貝
對於不同Hadoop版本間的拷貝,使用者應該使用HftpFileSystem。 這是一個唯讀檔案系統,所以DistCp必須運行在目標端叢集上(更確切的說是在能夠寫入目的地組群的TaskTracker上)。 源的格式是 hftp://<dfs.http.address>/<path> (預設情況dfs.http.address是 <namenode>:50070)。
Map/Reduce和副效應
像前面提到的,map拷貝輸入檔案失敗時,會帶來一些副效應。
除非使用了-i,任務產生的日誌會被新的嘗試替換掉。 
除非使用了-overwrite,檔案被之前的map成功拷貝後當又一次執行拷貝時會被標記為 "被忽略"。 
如果map失敗了mapred.map.max.attempts次,剩下的map任務會被終止(除非使用了-i)。 
如果mapred.speculative.execution被設定為 final和true,則拷貝的結果是未定義的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.