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

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

map 减少工作仅产生2个映射器,我想增加它。使用普通的map减少作业,我将配置yarn和mapper内存以增加mappers的数量。我在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,并且拆分数= 2
  • 最佳答案

    少分割文件,然后默认值不是一个有效的解决方案。在处理大型数据集时,基本上使用了拼写。默认值本身很小,因此不值得再次拆分。

    我建议您在查询之前进行以下配置。您可以根据输入数据应用它。

    set hive.merge.mapfiles=false;
    
    set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
    
    set mapred.map.tasks = XX;
    

    如果您还想分配 reducer 的数量,则可以使用以下配置
    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个映射器

    但是假设如果您有2个30MB大小的文件(每个文件),则每个文件将占用一个块,并且映射器将被分配
    基于此。

    当您使用大量的小文件时,Hive默认情况下使用CombineHiveInputFormat。
    就MapReduce而言,它最终转换为使用可创建虚拟拆分的CombineFileInputFormat。
    多个文件(按公共(public)节点分组)在可能的情况下进行存储。合并拆分的大小取决于
    mapred.max.split.size
    or
    mapreduce.input.fileinputformat.split.maxsize ( in yarn/MR2);
    

    因此,如果要减少分割(减少映射器),则需要将此参数设置得更高。

    该链接对于了解更多信息很有用。

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

    而且,映射器和精简器的数量始终取决于群集中可用的映射器和精简器插槽。

    07-26 09:16
    查看更多