小文件合并


Hive 自动合并小文件可以减轻 NameNode 的压力。数据量大可以有更好的压缩效率。并且后续处理这些数据时,任务的启动速度会加快。
但是配置稍微复杂,没有一个能用所有引擎的参数。

小文件的判断

如果一个 job 结束后,生成的文件的平均大小 小于 参数 hive.merge.smallfiles.avgsize 设定的值,则认为是小文件。如以下设置平均小文件的大小为 128M。

set hive.merge.smallfiles.avgsize=128000000;

合并后的目标文件大小

希望的合并后的目标文件大小,如果此值小于 hive.merge.smallfiles.avgsize, 则此值为 hive.merge.smallfiles.avgsize

set hive.merge.size.per.task=128000000;

合并Tez 作业产生的文件

此参数仅仅对 Tez 作业有作用。如果 Tez 作业的最终输出文件的平均大小小于 hive.merge.smallfiles.avgsize,则启用一个新的作业。

set hive.merge.tezfiles=true;

合并 MapOnly 的作业产生的文件

set hive.merge.mapfiles=true;

此参数设置为 true 的时候,仅合并 mapreduce 作业的 map only 作业。如以下 SQL 有 3 个 mapper,没有 reducer。每个 mapper 仅仅输出 十分之一的数据。结果输出了 3 个小文件。如果 hive.merge.mapfiles=true,会再启动一个作业来合并文件。

set hive.execution.engine=mr;
insert overwrite table  t2 select * from t1 where hash(c1) % 10 = 1;

合并 MapReduce 作业产生的文件

set hive.merge.mapredfiles=true;

此参数设置为 true 的时候,仅合并 有 reduce 任务的 mapreduce 作业。如以下 SQL 有 3 个 mapper,有 4 个 reducer。每个 mapper 仅仅输出 十分之一的数据。结果 reduce 任务输出了 4个小文件。如果 hive.merge.mapredfiles=true,会再启动一个作业来合并文件。

set hive.execution.engine=mr;
insert overwrite table  t2 select c1 from t1 where hash(c1) % 10 =1 group by c1 ;

综述
Hive 自动合并小文件可以减轻 NameNode 的压力。数据量大可以有更好的压缩效率。并且后续处理这些数据时,任务的启动速度会加快。
但是配置稍微复杂,没有一个能用所有引擎的参数。