2015-05-13 27 views
4

我從Hive創建了一個HBase表格,我試圖對它做一個簡單的聚合。這是我的Hive查詢:在Hadoop 2中增加Hive映射器的數量

from my_hbase_table 
select col1, count(1) 
group by col1; 

地圖縮小工作只產生2個mappers,我想增加它。用簡單的地圖減少工作,我會配置紗線和mapper內存來增加mapper的數量。我試着在蜂巢以下,但它沒有工作:

set yarn.nodemanager.resource.cpu-vcores=16; 
set yarn.nodemanager.resource.memory-mb=32768; 
set mapreduce.map.cpu.vcores=1; 
set mapreduce.map.memory.mb=2048; 

注:

  • 我測試的集羣裏只有2個節點
  • HBase的表中有超過500萬的記錄
  • 蜂巢日誌的詳細顯示HiveInputFormat和分割數= 2
+0

你的HBase表分成多少個區域? – Venkat

+0

集羣中有多少地圖插槽可用? –

+0

集羣中有多少地圖插槽可用? –

回答

2

將輸入分割大小從默認值減小。映射器將會增加。

SET mapreduce.input.fileinputformat.split.maxsize;

+0

什麼是默認值,我應該設置什麼?在使用HBase作爲輸入時,它可以在Hadoop2中工作嗎? – Gevorg

+0

執行此屬性沒有任何價值。 SET mapreduce.input.fileinputformat.split.maxsize; 這將打印出默認值,即默認最大分割大小。 現在通過設置屬性 將分割大小從默認值減小SET SET mapreduce.input.fileinputformat.split.maxsize = * Reduced Value *; –

14

拆分文件較小,然後默認值不是一個有效的解決方案。 Spiting基本上是在處理大型數據集時使用的。默認值本身是一個小尺寸,所以它不值得再次分割。

我會在您的查詢之前推薦以下配置。您可以根據您的輸入數據應用它。

set hive.merge.mapfiles=false; 

set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat; 

set mapred.map.tasks = XX; 

如果你要分配減速的數量也那麼你可以使用下面的配置

set mapred.reduce.tasks = XX; 

需要注意的是在Hadoop 2(紗),該mapred.map.tasksmapred.reduce.tasks已被棄用,並通過其他變量替換:

mapred.map.tasks  --> mapreduce.job.maps 
mapred.reduce.tasks --> mapreduce.job.reduces 

請參考以下有關此

有用的鏈接

http://answers.mapr.com/questions/5336/limit-mappers-and-reducers-for-specific-job.html

Fail to Increase Hive Mapper Tasks?

映射器得到如何分配映射器的

編號由在MapReduce工作中使用的InputFormat確定分割的數量來確定。 在典型的InputFormat中,它與文件和文件大小成正比。

假設您的HDFS塊配置配置爲64MB(默認大小),你有100MB大小的文件 那麼它會佔用2塊,然後2映射器將得到一個基於塊轉讓應

但假設如果你有兩個30MB大小的文件(每個文件),那麼每個文件將佔用一個塊,並且映射器將基於該文件得到assigend 。

當您使用大量小文件時,Hive默認使用CombineHiveInputFormat。 就MapReduce而言,它最終轉化爲使用CombineFileInputFormat,它可以在多個文件上創建虛擬分割 ,並在可能的情況下按照公共節點,機架進行分組。合併拆分的大小由

mapred.max.split.size 
or 
mapreduce.input.fileinputformat.split.maxsize (in yarn/MR2); 

所以,如果你想有更少的分裂(少映射器),你需要設置這個參數較高者確定。

此鏈接可用於瞭解更多信息。

What is the default size that each Hadoop mapper will read?

也映射器和減壓器的數量總是依賴羣集的可用映射器和減速插槽。

+0

'mapred.map.tasks'在最新版本的hadoop中已棄用。我試圖將這個和新的mapreduce.job.maps設置爲X,但它不起作用。你確定這可以在Hadoop2上運行嗎?另外,如果分割數是2,是否有可能有更多的映射器而不是分割? – Gevorg

+0

我需要在hadoop 2中檢查這個配置。我已經編輯了我的答案並且有關於mapper分配的解釋。我希望它能幫助你。 –

+0

在Hadoop 2中,mapper命令是'mapreduce.job.maps',而reducer命令是'mapreduce.job.reduces' –

1

拆分HBase表應該讓你的工作自動使用更多的映射器。

由於您有2個拆分,每個拆分由一個映射器讀取。增加no。的分裂。