Hadoop中一個distcp (R1)

thamsyangsw發表於2014-03-04
hadoop中有一個叫做distcp(分散式複製)的有用程式,能從hadoop的檔案系統並行複製大量資料。

distcp一般用於在兩個HDFS叢集中傳輸資料。如果叢集在hadoop的同一版本上執行,就適合使用hdfs方案:

   % hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar 
這將從第一個叢集中複製/foo目錄(和它的內容)到第二個叢集中的/bar目錄下,所以第二個叢集會有/bar/foo目錄結構。如果/bar不存在,則會新建一個。可以指定多個源路徑,並且所有的都會被複制到目標路徑。源路徑必須是絕對路徑。

預設情況下,distcp會跳過目標路徑已經有的檔案,但可以透過提供的-overwrite選項進行覆蓋,也可以用-update選項來選擇只更新那些修改過的檔案。

 

第一個叢集的子樹/foo下的一個檔案與第二個叢集的改變進行同步。

% hadoop distcp -update hdfs://namenode1/foo hdfs://namenode2/bar/foo 
distcp是作為一個MapReduce作業執行的,複製工作由叢集中並行執行的map來完成。這裡沒有reducer。每個檔案都由一個單一的map進行復制,並且distcp透過將檔案分成大致相等的檔案來為每個map數量大致相同的資料。

map的數量確定:

透過讓每一個map複製數量合理的資料以最小化任務建立所涉及的開銷,是一個很好的想法,所以每個map的副本至少為256MB。例如,1GB的檔案被分成4個map任務。如果資料很大,為限制頻寬和叢集的使用而限制對映的資料就變得很有必要。map預設的最大數量是每個叢集節點(tasktracker)有20個。例如,複製1000GB的檔案到一個100個節點的叢集,會分配2000個map(每個節點20個map),所以平均每個會複製512MB。透過對distcp指定-m引數,會減少對映的分配數量。例如,-m 1000會分配1000個map,平均每個複製1GB。

如果想在兩個執行著不同版本HDFS的叢集上利用distcp,使用hdfs協議是會失敗的,因為RPC系統是不相容的。想要彌補這種情況,可以使用基於HTTP的HFTP檔案系統從源中進行讀取。這個作業必須執行在目標叢集上,使得HDFS RPC版本是相容的。使用HFTP重複前面的例子:% hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar 

注意,需要在URI源中指定名稱節點的Web埠。這是由dfs.http.address的屬性決定的,預設值為50070。

保持HDFS叢集的平衡

向HDFS複製資料時,考慮叢集的平衡相當重要。檔案塊在叢集中均勻地分佈時,HDFS能達到最佳工作狀態。回顧前面1000 GB資料的例子,透過指定-m選項為1,即由一個單一的map執行復制工作,它的意思是,不考慮速度變慢和未充分利用叢集資源,每個塊的第一個副本會儲存在執行map的節點上(直到磁碟被填滿)。第二和第三個副本分散在叢集中,但這一個節點並不會平衡。透過讓map的數量多於叢集中節點的數量,我們便可避免這個問題。鑑於此,最好首先就用預設的每個節點20個map這個預設設定來執行distcp。

然而,這也並不總能阻止一個叢集變得不平衡。也許想限制map的數量以便一些節點可以被其他作業使用。若是這樣,可以使用balancer工具繼續改善叢集中塊的分佈。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26613085/viewspace-1100934/,如需轉載,請註明出處,否則將追究法律責任。

相關文章