您好,登錄后才能下訂單哦!
這篇文章主要講解了“hadoop distcp是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“hadoop distcp是什么”吧!
distcp(分布式拷貝)是用于大規模集群內部和集群之間拷貝的工具。 它使用Map/Reduce實現文件分發,錯誤處理和恢復,以及報告生成。 它把文件和目錄的列表作為map任務的輸入,每個任務會完成源列表中部分文件的拷貝。 由于使用了Map/Reduce方法,這個工具在語義和執行上都會有特殊的地方。 這篇文檔會為常用distcp操作提供指南并闡述它的工作模型。
標識 | 描述 | 備注 |
---|---|---|
Preserve r: replication number b: block size u: user g: group p: permission | 修改次數不會被保留。并且當指定 忽略失敗 | 就像在 附錄中提到的,這個選項會比默認情況提供關于拷貝的更精確的統計, 同時它還將保留失敗拷貝操作的日志,這些日志信息可以用于調試。最后,如果一個map失敗了,但并沒完成所有分塊任務的嘗試,這不會導致整個作業的失敗。 |
記錄日志到 <logdir> | DistCp為每個文件的每次嘗試拷貝操作都記錄日志,并把日志作為map的輸出。 如果一個map失敗了,當重新執行時這個日志不會被保留。 | |
同時拷貝的最大數目 | 指定了拷貝數據時map的數目。請注意并不是map數越多吞吐量越大。 | |
覆蓋目標 | 如果一個map失敗并且沒有使用 如果源和目標的大小不一樣則進行覆蓋 | 像之前提到的,這不是"同步"操作。 執行覆蓋的唯一標準是源文件和目標文件大小是否相同;如果不同,則源文件替換目標文件。 像 下面提到的,它也改變生成目標路徑的語義, 用戶使用要小心。 |
使用<urilist_uri> 作為源文件列表 | 這等價于把所有文件名列在命令行中。 urilist_uri 列表應該是完整合法的URI。 |
這里給出一些 -update和 -overwrite的例子。 考慮一個從/foo/a 和 /foo/b 到 /bar/foo的拷貝,源路徑包括:
hdfs://master1:8020/foo/a
hdfs://master1:8020/foo/a/aa
hdfs://master1:8020/foo/a/ab
hdfs://master1:8020/foo/b
hdfs://master1:8020/foo/b/ba
hdfs://master1:8020/foo/b/ab
如果沒設置-update或 -overwrite選項, 那么兩個源都會映射到目標端的 /bar/foo/ab。 如果設置了這兩個選項,每個源目錄的內容都會和目標目錄的 內容 做比較。distcp碰到這類沖突的情況會終止操作并退出。
默認情況下,/bar/foo/a 和 /bar/foo/b 目錄都會被創建,所以并不會有沖突。
現在考慮一個使用-update合法的操作:
distcp -update hdfs://master1:8020/foo/a \
hdfs://master1:8020/foo/b \
hdfs://master2:8020/bar
其中源路徑/大小:
hdfs://master1:8020/foo/a
hdfs://master1:8020/foo/a/aa 32
hdfs://master1:8020/foo/a/ab 32
hdfs://master1:8020/foo/b
hdfs://master1:8020/foo/b/ba 64
hdfs://master1:8020/foo/b/bb 32
和目的路徑/大小:
hdfs://master2:8020/bar
hdfs://master2:8020/bar/aa 32
hdfs://master2:8020/bar/ba 32
hdfs://master2:8020/bar/bb 64
會產生:
hdfs://master2:8020/bar
hdfs://master2:8020/bar/aa 32
hdfs://master2:8020/bar/ab 32
hdfs://master2:8020/bar/ba 64
hdfs://master2:8020/bar/bb 32
只有master2的aa文件沒有被覆蓋。如果指定了 -overwrite選項,所有文件都會被覆蓋。
distcp會嘗試著均分需要拷貝的內容,這樣每個map拷貝差不多相等大小的內容。 但因為文件是最小的拷貝粒度,所以配置增加同時拷貝(如map)的數目不一定會增加實際同時拷貝的數目以及總吞吐量。
如果沒使用-m選項,distcp會嘗試在調度工作時指定map的數目 為 min (total_bytes / bytes.per.map, 20 * num_task_trackers), 其中bytes.per.map默認是256MB。
建議對于長時間運行或定期運行的作業,根據源和目標集群大小、拷貝數量大小以及帶寬調整map的數目。
hadoop distcp -Ddistcp.bytes.per.map=1073741824 -Ddfs.client.socket-timeout=240000000 -Dipc.client.connect.timeout=40000000 -i -update hdfs://master1:8020/foo/a hdfs://master1:8020/foo/b hdfs://master2:8020/bar/foo
對于不同Hadoop版本間的拷貝,用戶應該使用HftpFileSystem。 這是一個只讀文件系統,所以distcp必須運行在目標端集群上(更確切的說是在能夠寫入目標集群的TaskTracker上)。 源的格式是 hftp://<dfs.http.address>/<path> (默認情況dfs.http.address是 <namenode>:50070)。
像前面提到的,map拷貝輸入文件失敗時,會帶來一些副效應。
除非使用了-i,任務產生的日志會被新的嘗試替換掉。
除非使用了-overwrite,文件被之前的map成功拷貝后當又一次執行拷貝時會被標記為 "被忽略"。
如果map失敗了mapred.map.max.attempts次,剩下的map任務會被終止(除非使用了-i)。
如果mapred.speculative.execution被設置為 final和true,則拷貝的結果是未定義的。
感謝各位的閱讀,以上就是“hadoop distcp是什么”的內容了,經過本文的學習后,相信大家對hadoop distcp是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。