如何在文件大于块大小的情况下减少配置单元中的映射器数量?

时间:2017-04-28 06:54:09

标签: hive mapper

人   我在hive中有一个包含超过720个分区的表,在每个分区中有超过400个文件,文件的平均大小为1G。

现在我执行以下SQL: 插入覆盖表test_abc select * from DEFAULT.abc A WHERE A.P_HOUR =' 2017042400' ;

此分区(P_HOUR =' 2017042400')有409个文件。当我提交这个sql时,我得到了以下输出

信息:减少任务的数量设置为0,因为没有减少运算符 信息:拆分数:409

信息:提交工作代币:job_1482996444961_9384015

我google很多doc找到如何减少mapper的数量,当文件很小时,很多doc解决了这个问题。    我直接尝试了下面的设置,但没有工作 ---------------第一次

set mapred.min.split.size =5000000000;
set mapred.max.split.size =10000000000;
set mapred.min.split.size.per.node=5000000000;
set mapred.min.split.size.per.rack=5000000000;

-----------------第二次

set mapreduce.input.fileinputformat.split.minsize =5000000000;
set mapreduce.input.fileinputformat.split.maxsize=10000000000;
set mapreduce.input.fileinputformat.split.minsize.per.rack=5000000000;
set mapreduce.input.fileinputformat.split.minsize.per.node=5000000000;

我的hadoop版本是 Hadoop 2.7.2 由root编译于2016年7月11日10:58:45 蜂巢版是 连接到:Apache Hive(版本1.3.0) 驱动程序:Hive JDBC(版本1.3.0)

2 个答案:

答案 0 :(得分:3)

除了帖子中的设置

set hive.hadoop.supports.splittable.combineinputformat=true;
  

hive.hadoop.supports.splittable.combineinputformat
    - 默认值:false
    - 添加In:Hive 0.6.0
  是否组合小输入文件以便生成更少的映射器。

答案 1 :(得分:0)

MRv2使用public void assignVariant1() { int c1 = 0 , c2=0 , c3=0 ,c4=0; for(int i = 0 ; i < 100000 ; i++) { if(Math.random() > 0.5) { c1++; }else { c2++; } if(Math.random() > 0.5) { c3++; }else { c4++; } } System.out.println("c1 + c2 "+ (c1+c2)); System.out.println("c1 + c2 "+ (c3+c4)); } ,而Tez使用分组拆分来确定Mapper。如果您的执行引擎是CombineInputFormat,并且您希望减少Mappers的使用:

mr

如果指定了mapreduce.input.fileinputformat.split.maxsize=xxxxx ,则同一节点上的块将合并为一个拆分。剩余的块然后与同一机架中的其他块组合。如果未指定maxSplitSize,则来自同一机架的块将合并为一个分区;没有尝试创建节点本地分裂。如果maxSplitSize等于块大小,则此类与Hadoop中的默认拆分行为类似

如果您的执行引擎是maxSplitSize

,这个link可以帮助控制Hive中的Mapper

如果您的执行引擎是mr,并且您希望控制Mappers,那么请使用:

tez

对于set tez.grouping.max-size = XXXXXX; 执行引擎的Hive中的并行性,这是一个很好的读取reference