2015-12-09 37 views
2

我正在做一些使用單節點hadoop作業的數據準備。我作業中的映射器/組合器輸出許多密鑰(超過5M或6M),顯然作業進展緩慢甚至失敗。映射階段最多可以運行120個映射器,只有一個reducer(這些都是自動確定的,我沒有爲它們設置任何值)。我想優化作業,以便更有效地進行混洗/分類階段。我將mapreduce.task.io.sort.mb增加到300米,但由於其值大於映射器堆,因此失敗。然後,我將mapred.child.java.opts設置爲-Xmx1024m,但由於無法初始化輸出收集器,所以再次失敗。這些場景的最佳做法是什麼?如何在hadoop作業中優化混洗/排序階段

回答

0

默認情況下,mapreduce只挑選一個reducer,這將成爲大多數情況下的問題。

要麼你可以通過設置減速機的數量到一個更高的價值job.setNumReduceTasks(24);

更改代碼或運行hadoop jar <jarfilename> <class> -Dmapreduce.job.reduces=24 <parameters>

您需要了解您的數據,以確定準確的減少數量。 Mapreduce框架根據拆分大小選擇多個映射器,但是應該由開發人員或操作團隊明確設置。

+0

沒錯。但我主要關心的是洗牌/分類階段。它與減少階段沒有任何關係。 –

+0

混洗/排序是與減速器相關的數量。作爲映射器生成的最終中間文件的混洗和排序數量的一部分將等於減縮器的數量。如果只有一個縮減器,則每個映射器只有一個由其他中間文件生成的最終中間文件。合併操作發生在內存中,並且只有一個reducer時可能會發生內存不足問題。嘗試增加一些reducer,問題可以解決。如果你正在做一些像count這樣的事情,需要使用一個reducer來運行,那麼你應該考慮combiner。 –

+0

謝謝。我會的,但是我怎麼能增加洗牌的內存呢? –

6

首先,由於您使用的是單節點集羣,因此沒有太多的優化可以完成。您將在單個節點羣集上擁有有限數量的容器/插槽以及正在處理的數據量(5至6百萬個密鑰),您的作業將始終運行緩慢並且可能會失敗。

我將回答這個問題,以獲得完全分佈式的Hadoop設置。在「Hadoop權威指南」一書中有一節(「Shuffle and Sort」),您應該閱讀它來調整Shuffle和Sort階段。我的答案主要受本節內容的影響,也是我自己調整MapReduce作業的經驗。

您可以執行以下操作來實現的洗牌和排序效率:

  • :使用組合將減少轉移到每個減速機的數據量,因爲合併合併的輸出映射器端。
  • 減速機數量:選擇減速機的最佳數量。如果數據量很大,那麼減速器不是一個好主意。另外,將減速器的數量設置爲較高的數字並不是一個好主意,因爲減速器的數量也決定了映射器端的分區數量。看看這裏的鏈接:https://github.com/paulhoule/infovore/wiki/Choosing-the-number-of-reducers
  • 何時啓動reducer:;當減少任務開始時,您可以控制。這由YARN中的配置mapreduce.job.reduce.slowstart.completedmaps確定。它將不會啓動減速器,直到完成一定比例的映射器。它默認設置爲「0.05」(這意味着減速器在5%的映射器完成後啓動)。如果減速器提前啓動,那麼大部分減速器都是空轉的,直到所有的製圖器都完成爲止。此外,減速器可能會消耗插槽,否則映射器可能會使用這些插槽進行處理。通過控制這一點,您可以最佳地使用映射器/縮減器插槽,並改善在混洗過程中花費的時間。
  • 壓縮映射器輸出:它建議壓縮映射器輸出(由配置確定:mapreduce.map.output.compress),以便較少的數據被寫入磁盤並被傳輸到reducer。
  • 調整配置「mapreduce.task.io.sort.mb」:增加排序過程中映射器使用的緩衝區大小。這將減少溢出到磁盤的次數。
  • 調整配置「mapreduce.reduce.input.buffer.percent」:如果您的reduce任務的內存要求較低,則可以將此值設置爲較高的百分比。這意味着,在縮小階段(洗牌階段之後)使用更多的堆來保留映射輸出,從而減少溢出到磁盤的次數。
  • 調整配置「mapreduce.reduce.shuffle.parallelcopies」:用於將映射輸出複製到reducer的線程數。檢查這裏的鏈接:how to tune mapred.reduce.parallel.copies?

以下是可以調整,以提高洗牌和排序階段的表現其他配置參數(在這裏看到這些配置的描述:https://hadoop.apache.org/docs/r2.4.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml):

  • mapreduce.map.sort.spill.percent:確定映射器使用的內存緩衝區的閾值。達到此閾值時,緩衝區的內容會溢出到磁盤。因此,此值決定了磁盤溢出的數量
  • mapreduce.task.io.sort.factor:排序期間一次要合併的最小流數。因此,在縮減器方面,如果有50個映射器輸出,並且此值設置爲10,則將進行5輪合併(平均每輪合併10個文件)。
  • mapreduce.shuffle.max.threads:將映射輸出複製到縮減器的工作線程數。
  • mapreduce.reduce.shuffle.input.buffer.percent:在減速器中的混洗階段,應該使用多少堆來存儲映射輸出。此設置決定了在映射器輸出到磁盤之前可以保存在內存中的映射器輸出量。
  • mapreduce.reduce.shuffle.merge.percent:啓動合併和溢出到磁盤的過程的閾值
  • mapreduce.reduce.merge.inmem.threshold:啓動合併過程所需的映射輸出的數量。當到達mapreduce.reduce.shuffle.merge.percentmapreduce.reduce.merge.inmem.threshold時,則映射輸出合併並溢出到磁盤。
+0

寫得很好的總結。 –