hive计算合并小文件

hive增加自动合并小文件配置以及在map阶段将多个小文件合并成一个计算。可以提高资源的利用率。

比如由于小文件原先需要启动10个map,现在只需要启动2个map。

hadoop hive 环境: hadoop2.6+hive1.2.1 lzo压缩

hive-site.xml 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<property>
<name>hive.merge.mapfiles</name>
<value>true</value>
</property>
<property>
<name>hive.merge.mapredfiles</name>
<value>true</value>
</property>
<property>
<name>hive.merge.smallfiles.avgsize</name>
<value>69000000</value>
</property>
<property>
<name>hive.merge.size.per.task</name>
<value>256000000</value>
</property>
<property>
<name>hive.merge.tezfiles</name>
<value>true</value>
</property>
<property>
<name>mapreduce.input.fileinputformat.split.maxsize</name>
<value>256000000</value>
</property>
<property>
<name>mapreduce.input.fileinputformat.split.minsize</name>
<value>1</value>
</property>
<property>
<name>mapreduce.input.fileinputformat.split.minsize.per.node</name>
<value>128000000</value>
</property>
<property>
<name>mapreduce.input.fileinputformat.split.minsize.per.rack</name>
<value>128000000</value>
</property>

参数说明自己查吧!

https://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration

测试的步骤

启动压缩

1
2
3
set hive.exec.compress.output=true;

set mapreduce.output.fileoutputformat.compress=true;

一.减少map数,(当有大量小文件时,启动合并)

1
2
3
4
5
6
7
8
9
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

set mapreduce.input.fileinputformat.split.maxsize=1073741824;

set mapreduce.input.fileinputformat.split.minsize=1;

set mapreduce.input.fileinputformat.split.minsize.per.node=536870912;

set mapreduce.input.fileinputformat.split.minsize.per.rack=536870912;

经过测试,这种设置可以在map阶段和并小文件,减少map的数量。

注意:在测试的时候,如果文件格式为Textfile,并且启用lzo压缩,不能生效。 rcfile以及orc可以生效,Textfile不启用lzo压缩也可以生效。如果是新集群的话,没有历史遗留的问题的话,建议hive都使用orc文件格式,以及启用lzo压缩。

二.MR作业结束后,判断生成文件的平均大小,如果小于阀值,就再启动一个job来合并文件

1
2
3
4
5
set hive.merge.mapredfiles=true;

set hive.merge.mapfiles=true;

set hive.merge.smallfiles.avgsize=268435456;

如果你感觉文章还可以的话,请帮点点下面的广告!谢谢!

感谢您的支持!