Hive MR优化

Hive MR优化

1. map reduce个数选择

在这方面,尤其是map的选择,基本上决定了整个job的运行时间(一般reduce阶段数据量都比较少了),map个数的决定因素是split的大小、文件个数、block大小,一般通过split的大小来调整map的个数。

set mapreduce.input.fileinputformat.split.maxsize=67108864;
set mapreduce.input.fileinputformat.split.minsize=67108864;

或者:

set mapred.max.split.size=67108864;

在调整的过程中,最好整倍整倍的调整,具体map调整到一个什么程度,还需要根据集群的资源情况;另外一点就是如果是压缩格式文件,基本上没法调整,文件个数直接决定了map数。

对于reduce的个数的设置:可通过以下两个配置项来调整:

set mapred.reduce.tasks=100;
set hive.exec.reducers.bytes.per.redurcer=20971520;

2. 调整一批运行的map数

这里一批运行的map数指的实在resourceManager界面中观察,当任务开始运行后,正在运行的map个数,该值实际上是由集群能力来决定,具体到参数:

set mapreduce.map.memory.mb=2048;
set mapreduce.reduce.memory.mb=2048;
set mapreduce.map.java.opts=Xmx2048M;
set mapreduce.reduce.java.opts=Xmx2048M;
set mapreduce.map.cpu.vcores=2;
set mapreduce.reduce.cpu.vcores=2;

这几个参数实际上决定了启动一个map所需要占用的系统资源,因此在总资源确定的情况下,通过调整这些参数总是能够调整一批运行的map数量,具体一批运行多少map比较合适,这个需要经过多次调整才知道。

3. 动态调整

动态调整前两条,保证任务比较均匀的分配到集群的各个机器上。例如发现所有的map都在第一轮中运行了,但发现运行的比较慢,超过了一个5分钟,而通过对机器的监控发现有些机器上并没有map在运行,说明map数划分的有些少了,且每个map的资源分配的也比较少,需要通过减少split大小来增大map,通过增大map所占用资源的大小来减少单台机器上所能运行map数,一般调整到map相对比较均匀的分布,单个map运行时间大于1分钟,而又不能太长。

4. 设置合理的reduce启动时间

通过设置set mapreduce.job.reduce.slowstart.completedmaps=0.1

该参数的意义是当map完成多少时开始启动reduce,如果不配置,则默认时0.5,当资源比较受限时最好把这个值配置的大一些,否则就会出现reduce和map竞争资源的问题,而reduce又没法获取到map的输出(map全部跑完则为1,这里还是零点几),所以基本上会导致整体运行时间的加长,一般也不要设置成为1,如果等待map的结束的话,同样也是浪费资源,所以需要综合集群的资源来设置合理的启动时间。

5. 设置sort时的内存

设置 set mapreduce.task.io.sort.mb=1024; 的值略小于reduce的内存,避免浪费。sort的时候配置到reduce的大小能加快运行速度,也能避免不必要的浪费。

6. 对map的输出结果进行压缩,提升从map到reduce的传输效率

set mapreduce.output.compress=true;
set mapreduce.output.compression.type=BLOCK;
set mapreduce.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

7. 对于复杂的任务,还需要通过并行来提升整体运行速度

set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;

对于Hive所启动的MR优化调整是一个相对比较复杂的过程,需要多跑几次找出性能瓶颈并进行调整才是解决问题的正确途径。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章