2013-10-24 68 views
9

我使用hdfs -put將大型20GB文件加載到hdfs中。目前該流程運行@ 4分鐘。我試圖提高將數據加載到hdfs的寫入時間。我嘗試使用不同的塊大小來提高寫入速度,但得到的結果如下:Hadoop把性能 - 大文件(20GB)

512M blocksize = 4mins; 
256M blocksize = 4mins; 
128M blocksize = 4mins; 
64M blocksize = 4mins; 

有誰知道什麼瓶頸可能是和其他的選擇,我可以探索改善的-put CMD表現?

+0

所以這目前80 MB/s。調查磁盤和網絡I/O。你的磁盤/網絡能更好嗎?你的確切設置是什麼?單臺機器還是集羣? – harpun

回答

12

20GB/4分鐘約85MB /秒。對於HDFS協議和網絡所有開銷的單個驅動器來說,這是非常合理的吞吐量。我敢打賭,這是你的瓶頸。在不改變你的攝取過程的情況下,你無法使這個神奇的速度變得更快。

核心問題是20GB是一個體面的數據量和數據作爲一個單一的流推入HDFS。由於Hadoop集羣中有大量磁盤,所以你受到磁盤I/O的限制。你需要一段時間才能使10GigE網絡飽和(也可能是1GigE)。如您所見,更改塊大小不應改變此行爲。它仍然是相同數量的磁盤到HDFS的數據。

我建議你將文件分割成1GB文件並分散在多個磁盤上,然後用-put並行壓入。如果網絡成爲瓶頸,您甚至可能想要考慮將這些文件分割成多個節點。您是否可以改變收到數據的方式以使其更快?明顯地分割文件並移動文件也需要時間。

9

這取決於你的設置的細節很多。首先知道在4分鐘20GB是80MBps

瓶頸很可能是您本地機器的硬件或其以太網連接。我懷疑玩塊大小會提高你的吞吐量。

如果你的本地機器有一個典型的7200rpm硬盤,其磁盤緩衝傳輸速率大約是128MBps,這意味着它可能是20BG文件加載到內存在約2:35,假設你有20GB,以備用。但是,您不只是將它複製到內存中,而是將它從內存中傳輸到網絡數據包,因此可以理解的是,您需要額外處理這些任務的開銷。

另請參閱wire speed上的維基百科條目,該條目將快速以太網設置爲100Mbit/s(〜12MB/s)。請注意,在這種情況下,快速以太網是一組特定的以太網標準的術語。你顯然比這更快。線速度是一個很好的衡量標準,因爲它考慮了本地計算機上的所有因素。

讓我們打破在流動過程中的不同步驟在本地計算機上:

  • 從文件中讀取數據塊並將其加載到內存中。 組件:硬盤驅動器,內存
  • 拆分並將該塊轉換爲數據包。最後我聽說Hadoop沒有使用開箱即用的DMA功能,所以這些操作將由您的CPU而不是NIC執行。 組件:內存,CPU
  • 將數據包傳輸到hadoop文件服務器。組成:網卡,網

不知道更多關於你的本地機器上,就很難說明這些組件是瓶頸。但是,這些是開始調查比特率的地方。

2

您可能需要使用DistCp使用 Hadoop的DistCp使用-Ddfs.block.size = $ [256 * 1024 * 1024] /路徑/到/ inputdata /路徑/到/ outputdata 執行並行副本