Insert Overwrite 进行hive或impala小文件合并后 文件数量不是1

HDFS的表里面,按天分区,每个分区都有很多的小文件,长此以往必然会导致性能的下降。所以我们在保持原来的业务逻辑不变,增加每日跑批 来合并分区内的小文件。

刚开始我是直接Impala执行Insert overwrite ,想合并某一天分区内的4份文件, 发现分区内部的文件数还是4个,我就纳闷,以为我记错了 overwrite 的执行原理,然后使用Hive 进行 insert overwrite,结果文件数变成了2个,我就纳闷了。。
然后想到可能是因为写线程的问题。于是网上搜怎么配置这些参数,问题就解决了。Impala 的那个配置是从官网挨个实验的,当然,这些设置会影响执行sql的性能,但是能保证只生成一份文件,怎么取舍自己考虑。

Hive 的方法:

set mapred.reduce.tasks=1;
set hive.merge.mapredfiles=true;
insert overwrite table xx.xxx
partition (year=2020,month=4,day=1)
select
	fields...
from xx.xxx
where year=2020
and month=4
and day=3

set mapred.reduce.tasks=1;
set hive.merge.mapredfiles=true;
增加这两个配置是为了保持输出的文件只有一个。为什么要这么配置可以想想MapReduce 的原理,我们要保证最后只有一个reduce。

Impala 同样,但是需要设置的参数有点不同,还有sql 的写法也略有差异

set NUM_NODES=1;

insert overwrite xx.xx(
    	fields...
)
partition (idn_year={idn_year},idn_month={idn_month},idn_day={idn_day})
    select 
    	fields...
from x.xx
where 
    idn_year={idn_year} 
    and idn_month={idn_month}
    and idn_day={idn_day}

set NUM_NODES=1;
了解Impala原理的都知道,Impala是有执行器和接收器的,默认情况这个参数是0,即所有节点一起跑,并行执行任务,设置为1后,就是接收器单节点跑,结果很明显,并行跑的很多会有多个文件,单节点才能保证只有一个文件。

注意:
这些参数的设置不是都是死的,你要根据自己的表的内容的增量来判断,到底是合并为一份文件,还是多少份文件比较合适,毕竟还是要尽量配合128M的嘛。

你可能感兴趣的:(Impala,hive,小甜点,hive,impala)