增加Hadoop 2中的Hive映射器数量

时间:2015-05-13 17:53:40

标签: java hadoop hive hbase hadoop2

我从Hive创建了一个HBase表,我试图对它进行简单的聚合。这是我的Hive查询:

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

map reduce工作只产生2个映射器,我想增加它。使用普通地图缩小作业,我将配置纱线和映射器内存以增加映射器的数量。我在Hive中尝试了以下操作,但它不起作用:

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表有超过5M条记录
  • Hive日志显示HiveInputFormat和一些splits = 2

3 个答案:

答案 0 :(得分:18)

将文件拆分较小,然后默认值不是一个有效的解决方案。在处理大型数据集时基本上使用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(YARN)上,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大小的文件(每个文件),那么每个文件将占用一个块,mapper将得到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?

映射器和缩减器的数量也始终取决于群集的可用映射器和缩减器插槽。

答案 1 :(得分:4)

将输入分割大小从默认值减小。映射器将会增加。

SET mapreduce.input.fileinputformat.split.maxsize;

答案 2 :(得分:1)

拆分HBase表应该让你的工作自动使用更多的映射器。

由于您有2个拆分,因此每个拆分由一个映射器读取。增加没有。分裂。