天天看點

hadoop 通過distcp并行複制。

hadoop權威指南第四版

Hadoop自帶一個有用程式distcp,該程式可以并行從Hadoop檔案系統中複制大量資料,也可以系那個大量資料複制到Hadoop中。

        Distcp的一種用法是替代 hadoop fs -cp。例如,我們可以将檔案複制到另一個檔案中:

% hadoop distcp file1 file2
           

也可以複制目錄:

% hadoop distcp dir1 dir2
           

        如果dir2 不存在,将建立dir2,目錄dir1的内容全部複制到dir2下。可以指定多個源路徑,所有源路徑下的内容都将被複制到目錄路徑下。

        如果dir2 已經存在,那麼目錄dir1将被複制到dir2下,形成目錄結構dir2/dir1。如果這不是你所需的,你可以補充使用-overwrite選項,在保持同樣的目錄結構的同時強制覆寫原有檔案。你也可以使用-update選項,僅更新發生變化的檔案。用一個示例可以更好解釋這個過程。如果我們修改了dir1 子樹中一個檔案,我們能夠通過運作以下指令将修改同步到dir2中:

hadoop distcp -update dir1 dir2
           

        建議:如果不确定discp操作的效果,最好先在一個小的測試目錄樹下試運作。

        distcp是作為一個MapReduce作業來實作的,該複制作業是通過叢集中并行運作的map來完成。這裡沒有reducer。每個檔案通過一個map進行複制,并且distcp試圖為每一個map配置設定大緻相等的資料來執行,即把檔案劃分為大緻相等的塊。預設情況下,将近20個map被使用,但是可以通過為distcp指定-m參數來修改map的數目。

        關于distcp的一個常見使用執行個體是在兩個HDFS叢集間傳送資料。例如,以下命名在第二個叢集上為第一個叢集/foo目錄建立了一個備份:

hadoop distcp -update -delete -p hdfs://namenode1/foo hdfs:namenode2/foo
           

        -delete選項使得distcp可以删除目錄路徑中任意沒有原路徑中出現的檔案或目錄,-P 選項意味着檔案狀态屬性如權限、塊大小和複本數被保留。當你運作不帶參數的distcp時,能夠看到準确的用法。

        如果兩個叢集運作的是HDFS的不相容版本,你可以将webhdfs協定用于他們之間的distcp:

hadoop distcp webhdfs://namenode1:50070/foo webhdfs://namenode2:50080/foo
           

        另一個變種是使用HttpFs代理作為distcp源或目标(有一次使用了webhdfs協定),這樣具有設定防火牆和控制帶寬的優點。

繼續閱讀