hadoop 資料遷移

2021-07-24 07:15:33 字數 3856 閱讀 6460

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

記錄日誌到

distcp為每個檔案的每次嘗試拷貝操作都記錄日誌,並把日誌作為map的輸出。 如果乙個map失敗了,當重新執行時這個日誌不會被保留。

-m 同時拷貝的最大數目

指定了拷貝資料時map的數目。請注意並不是map數越多吞吐量越大。

-overwrite

覆蓋目標

如果乙個map失敗並且沒有使用-i選項,不僅僅那些拷貝失敗的檔案,這個分塊任務中的所有檔案都會被重新拷貝。 就像下面提到的,它會改變生成目標路徑的語義,所以 使用者要小心使用這個選項。

-update

如果源和目標的大小不一樣則進行覆蓋

像之前提到的,這不是"同步"操作。 執行覆蓋的唯一標準是原始檔和目標檔案大小是否相同;如果不同,則原始檔替換目標檔案。 像 下面提到的,它也改變生成目標路徑的語義, 使用者使用要小心。

-f 使用作為原始檔列表

這等價於把所有檔案名列在命令列中。 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選項,所有檔案都會被覆蓋。

distcp會嘗試著均分需要拷貝的內容,這樣每個map拷貝差不多相等大小的內容。 但因為檔案是最小的拷貝粒度,所以配置增加同時拷貝(如map)的數目不一定會增加實際同時拷貝的數目以及總吞吐量。

如果沒使用-m選項,distcp會嘗試在排程工作時指定map的數目 為 min (total_bytes / bytes.per.map, 20 * num_task_trackers), 其中bytes.per.map預設是256mb。

建議對於長時間執行或定期執行的作業,根據源和目標集群大小、拷貝數量大小以及頻寬調整map的數目。

對於不同hadoop版本間的拷貝,使用者應該使用hftpfilesystem。 這是乙個唯讀檔案系統,所以distcp必須執行在目標端集群上(更確切的說是在能夠寫入目標集群的tasktracker上)。 源的格式是hftp:/// (預設情況dfs.http.address是 :50070)。

像前面提到的,map拷貝輸入檔案失敗時,會帶來一些副效應。

hadoop間資料遷移

具體操作 使用distcp命令跨hdfs遷移資料 在 hadoop 版本不一致時,distcp 命令也不一樣 使用詳情參看官網 distcp有多中資料複製模式 hdfs,http,hftp 目標端hadoop需要賦予外來使用者對資料夾寫入的許可權,hadoop fs chmod 755 x 1 同版...

Hadoop資料遷移 distcp 工具

hadoop distcp 備份hdfs檔案,並行複製大量資料。1.同版本集群之間複製 hadoop distcp hdfs namenode1 src hdfs namenode2 dist這將從第乙個集群中複製 src目錄下的內容複製到第二個集群中的 dist目錄下 預設情況下,distcp會跳...

Hadoop集群間HBase資料遷移

背景 hbase cluster1 hbase cluster2 利用hbase的snapshots功能,進行集群之間的hbase資料前移 1.開啟snapshots功能 0.95及以上版本預設開啟了 hbase.snapshot.enabledname truevalue property 2.建...