人 我在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)
答案 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
如果您的执行引擎是mr
,并且您希望控制Mappers,那么请使用:
tez
对于set tez.grouping.max-size = XXXXXX;
执行引擎的Hive中的并行性,这是一个很好的读取reference,