解释:web
一、JVM重用是hadoop调优参数的内容,对hive的性能具备很是大的影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。hadoop默认配置是使用派生JVM来执行map和reduce任务的,这是jvm的启动过程可能会形成至关大的开销,尤为是执行的job包含有成千上万个task任务的状况。jvm
JVM重用可使得JVM实例在同一个JOB中从新使用N次,N的值能够在Hadoop的mapre-site.xml文件中进行设置oop
mapred.job.reuse.jvm.num.tasks性能
也可在hive的执行设置:优化
set mapred.job.reuse.jvm.num.tasks=10;spa
JVM的一个缺点是,开启JVM重用将会一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。若是某个“不平衡“的job中有几个reduce task 执行的时间要比其余reduce task消耗的时间多得多的话,那么保留的插槽就会一直空闲着却没法被其余的job使用,直到全部的task都结束了才会释放。orm
二、并行执行,意思是同步执行hive的多个阶段,hive在执行过程,将一个查询转化成一个或者多个阶段。某个特定的job可能包含众多的阶段,而这些阶段可能并不是彻底相互依赖的,也就是说能够并行执行的,这样可能使得整个job的执行时间缩短xml
hive执行开启:set hive.exec.parallel=truehadoop
三、调整reducer个数:同步
设置 hive.exec.reducers.bytes.per.reducer(默认为1GB),受hive.exec.reducers.max(默认为999)影响:
mapred.reduce.tasks = min ( 参数2,总输入数据量/参数1 )
三个优化的场景:
采用一个数据源多份处理的SQL来执行:
FROM TABLE1
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table1.txt' SELECT 20140303, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140303 AND col3 >= 20140201 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table2.txt' SELECT 20140302, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140302 AND col3 >= 20140131 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table3.txt' SELECT 20140301, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140301 AND col3 >= 20140130 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table4.txt' SELECT 20140228, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140228 AND col3 >= 20140129 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table5.txt' SELECT 20140227, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140227 AND col3 >= 20140128 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table6.txt' SELECT 20140226, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140226 AND col3 >= 20140127 GROUP BY col1, col2
………………省略
没设置前的,执行时间是450s
设置参数:
set mapred.job.reuse.jvm.num.tasks=20
set hive.exec.reducers.bytes.per.reducer=150000000
set hive.exec.parallel=true;
执行时间缩短到273s ,合理利用一个参数调整,能够达到部分调优