2013-05-06 140 views
1

讀通過的Hadoop所產生的日誌,我可以看到類似這樣的行可用的地圖插槽數..Hadoop的:基於簇大小

2013-05-06 16:32:45,118 INFO org.apache.hadoop.mapred.JobClient (main): Setting default number of map tasks based on cluster size to : 84 

有誰知道這個值是如何計算的? 如何在我的程序中獲得此值?

+0

您正在使用哪種Hadoop版本?您是否在AWS上使用Amazon Elastic MapReduce? – harpun 2013-05-06 17:59:45

+0

是的,我在AWS上使用Amazon Elastic MapReduce。 Hadoop版本1.0.4 – Matteo 2013-05-06 18:32:25

回答

0

所以這是根據您的輸入大小默認設置的。 http://wiki.apache.org/hadoop/HowManyMapsAndReduces。您可以指定更多的映射器,但不能少於hadoop定義的數量。

您應該可以通過獲取配置選項「mapred.map.tasks」來訪問此編號。如果你使用舊的API,你也可以從這個函數中獲取它。

conf.getNumMapTasks(); 

這個前面的問題,How to set the number of map tasks in hadoop 0.20?,有一些很好的答案,以及

0

這主要是InputFormat的責任找到了沒有。的映射器,它是基於由您的InputFormat類的getSplits(JobContext context)方法編寫的邏輯創建的InputSplits完成的。指定no。通過Job或配置文件映射器或通過shell指定它只是提示框架,並不能保證你總能得到指定的no。的mappers。

+0

我不認爲這個問題是關於否。工作需要的mappers。問題是關於一個集羣可以處理的同時映射器的數量。 – ernesto 2014-11-11 11:51:39

3

我grepped Hadoop的源代碼,並沒有找到字符串Setting default number of map tasks based on cluster size to在所有(但我發現其他字符串,正在打印時運行MR作業)。此外,這個字符串不會被打印在本地安裝的任何地方。谷歌搜索它列出了AWS與EMR的問題。 如您所確認的,您實際上使用Amazon Elastic MapReduce。我相信EMR對類Hadoop有一些自己的修改,它會輸出這個特定的行。

就計算這個數字而言,我懷疑它是根據像total number of (active) nodes in cluster (N)number of map slots per node (M)這樣的特徵,即N*M來計算的。但是,也可能會考慮其他AWS特定的資源(內存)限制。您必須在EMR相關論壇中詢問確切的公式。另外,JobClient公開了關於集羣的一組信息。使用方法JobClient#getClusterStatus()可以訪問如下信息:

  • 集羣的大小。
  • 追蹤器的名稱。
  • 列入黑名單/活動跟蹤器的數量。
  • 羣集的任務容量。
  • 當前正在運行的地圖數&減少任務。

通過ClusterStatus類對象,因此您可以嘗試手動計算您的程序中所需的數字。

+0

這似乎很有用,但'JobClient'屬於舊包'org.apache.hadoop.mapred',我試圖弄清楚如何從org.apache.hadoop.mapreduce中獲得'JobClient'。工作'對象。 我也發現'org.apache.hadoop.mapred.JobTracker'類有'getClusterMetrics()'方法。它返回我需要的信息..但又沒有找到一種方法來獲取此對象的一個​​實例。 – Matteo 2013-05-07 11:46:08

+1

我認爲你在這裏使用'JobClient'。或者,您可以嘗試通過JMX訪問JobTracker。不過,我不確定它是否會提供所有需要的指標。在hadoop 2.0中檢索更容易。看看[示例](https://github.com/apache/hadoop-common/blob/trunk/hadoop-mapreduce-project/hadoop-mapreduce-examples/src/main/java/org/apache/hadoop /examples/pi/DistSum.java)附帶hadoop的源代碼(第391,405行)。它使用Cluster#getClusterStatus()來獲取一個'ClusterMetrics'實例。 'Cluster'實例是通過像JobClient這樣的URL來構造的。 – harpun 2013-05-07 20:43:54