Hive-合理设置 Map 及 Reduce 数

合理设置Map个数

通常情况下,作业会通过 input 的目录产生一个或者多个 map 任务。 主要的决定因素有:input 的文件总个数,input 的文件大小,集群设置的文件块大小。

是不是 map 数越多越好?
答案是否定的。如果一个任务有很多小文件(远远小于块大小 128m),则每个小文件也会被当做一个块,用一个 map 任务来完成,而一个 map 任务启动和初始化的时间远远大 于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的 map 数是受限的。

是不是保证每个 map 处理接近 128m 的文件块,就高枕无忧了?
答案也是不一定。比如有一个 127m 的文件,正常会用一个 map 去完成,但这个文件只 有一个或者两个小字段,却有几千万的记录,如果 map 处理的逻辑比较复杂,用一个 map 任务去做,肯定也比较耗时。

复杂文件增加 Map 数

当 input 的文件都很大,任务逻辑复杂,map 执行非常慢的时候,可以考虑增加 Map 数, 来使得每个 map 处理的数据量减少,从而提高任务的执行效率。

增加 map 的方法为:根据:
computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M 公式, 调整 maxSize 最大值。让 maxSize 最大值低于 blocksize 就可以增加 map 的个数。

案例实操:

1)执行查询

hive (default)> select count(*) from emp;
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1

2)设置最大切片值为 100 个字节

hive (default)> set mapreduce.input.fileinputformat.split.maxsize=100; hive (default)> select count(*) from emp;
Hadoop job information for Stage-1: number of mappers: 6; number of reducers: 1

小文件进行合并

1)在 map 执行前合并小文件,减少 map 数:CombineHiveInputFormat 具有对小文件进行合 并的功能(系统默认的格式)。HiveInputFormat 没有对小文件合并功能。

set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

2)在 Map-Reduce 的任务结束时合并小文件的设置:
在 map-only 任务结束时合并小文件,默认 true

SET hive.merge.mapfiles = true; 

在 map-reduce 任务结束时合并小文件,默认 false

SET hive.merge.mapredfiles = true; 

合并文件的大小,默认 256M

SET hive.merge.size.per.task = 268435456; 

当输出文件的平均大小小于该值时,启动一个独立的 map-reduce 任务进行文件 merge

SET hive.merge.smallfiles.avgsize = 16777216; 

合理设置 Reduce 数

调整 reduce 个数方法一

(1)每个 Reduce 处理的数据量默认是 256MB

hive.exec.reducers.bytes.per.reducer=256000000 

(2)每个任务最大的 reduce 数,默认为 1009

hive.exec.reducers.max=1009 

(3)计算 reducer 数的公式

N=min(参数 2,总输入数据量/参数 1)

调整 reduce 个数方法二

在 hadoop 的 mapred-default.xml 文件中修改 设置每个 job 的 Reduce 个数

set mapreduce.job.reduces = 15; 

reduce 个数并不是越多越好

(1)过多的启动和初始化 reduce 也会消耗时间和资源;
(2)另外,有多少个 reduce,就会有多少个输出文件,如果生成了很多个小文件,那 么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

在设置 reduce 个数的时候也需要考虑这两个原则:处理大数据量利用合适的 reduce 数; 使单个 reduce 任务处理数据量大小要合适;

你可能感兴趣的:(Hive,hive)