2014-09-03 81 views
3

我一直在閱讀關於Hadoop Map/Reduce的一些文章,而一般的主題似乎是:Hadoop Jobs是I/O密集型的(例如:使用Map/Reduce排序)。爲什麼Hadoop被認爲是I/O密集型的?

什麼使得這些工作I/O密集型(鑑於Hadoop推動計算到數據的事實)? 示例:爲什麼在Hadoop I/O密集型中排序?

我的直覺:似乎在映射階段之後,中間對被髮送給reducer。這是否導致了巨大的I/O?

+0

是的,數據寫入磁盤。 – 2014-09-03 20:21:00

+0

有計算密集的情況嗎?傳統的排序算法在一般意義上需要大量的計算。 – 2014-09-03 20:24:59

+0

是的,當你沒有從磁盤讀取(很多)的東西;-) – 2014-09-03 20:25:58

回答

5

Hadoop用於對大量數據執行計算。您的工作可能受到IO(資源密集型,稱爲I/O密集型),CPU和網絡資源的限制。在使用Hadoop的經典案例中,您正在對大量輸入數據執行本地計算,同時返回相對較小的結果集,這使得您的任務比CPU和網絡密集型更具IO密集度,但它非常依賴於作業本身。以下是一些示例:

  1. IO強化作業。你在地圖上讀了很多數據,但你的地圖任務的結果並不那麼大。一個例子是計算輸入文本中的行數,計算來自RCfile的某列的總和,通過具有相對較小基數的列的組獲得Hive查詢的結果。這意味着你的工作所做的事情主要是讀取數據並對其進行一些簡單的處理。
  2. CPU密集作業。當你需要在地圖上執行一些複雜的計算或減少方面。例如,你正在做一些類似標記化的NLP(自然語言處理),部分語言標記,詞幹等等。另外,如果以高壓縮率格式存儲數據,數據解壓縮可能會成爲該流程的瓶頸(這裏是他們在尋找CPU和IO之間平衡的example from Facebook)。通常情況下,如果您在羣集上看到高網絡利用率,則意味着有人錯過了這一點,並實現了通過網絡傳輸大量數據的作業。在wordcount的例子中,想象一下在這個工作中輸入數據的1PB只用mapper和reducer處理,不需要組合器。這樣,在map和reduce任務之間移動的數據量將比輸入數據集更大,並且所有這些都將通過網絡發送。另外,這可能意味着您不使用中間數據壓縮(mapred.compress.map.output和mapred.map.output.compression.codec),並且通過網絡發送原始地圖輸出。

您可以參考this guide爲集羣 的初始調整,爲什麼排序是IO密集型的?首先,您從磁盤讀取數據。接下來,在排序映射器生成的數據量與讀取的數據量相同時,意味着它很可能不適合內存,並且應該傳播到磁盤。然後它被轉移到reducer並再次溢出到磁盤。然後它被減速器處理並再次沖刷到磁盤。而排序所需的CPU相對較小,特別是如果排序關鍵字是數字並且可以從輸入數據輕鬆解析。

相關問題