介绍
如果Hive表或者分区有太多小文件,那么HQL性能非常差,有时在提交它之前,需要很长时间准备MapReduce job,因为Hive需要获取每个文件元数据。这篇文章解释当添加数据到Hive表后,如何控制文件数量。
insert overwrite table target select * from source;
上面的SQL有两个主要步骤:
MapReduce(这个例子仅仅是Map) job从源表中读数据
mappers的数量决定中间结果文件数量,mappers数量由下面因素决定:
- Hive.input.format
不同输入格式开启不同的mappers数量,hive0.13及以上版本默认是org.apache.hadoop.hive.ql.io.CombineHiveInputFormat,将会结合所有文件到一起,然后切割文件,以至于如果表有太多小文件,性能可以得到优化。老的输入格式是 org.apache.hadoop.hive.ql.io.HiveInputFormat,它会单独切割每个文件,例如,如果有10个小文件,每个文件仅仅有一行,Hive需要10个mappers来读取表。
这篇文章使用默认的CombineHiveInputFormat - FIle split size
mapred.max.split.size和mapred.min.split-size控制目标文件切割大小,(在最新的Hadoop2.x中,这两个参数过时了),新参数是mapreduce.input.fileinputformat.split.maxsize和mapre