牛骨文教育服务平台(让学习变的简单)
博文笔记

Hive常用优化参数

创建时间:2015-07-22 投稿人: 浏览次数:2625

常用调优测试语句 : 
①显示当前hive环境的参数值: set 参数名; 如:   hive> set mapred.map.tasks;
mapred.map.tasks;

②设置hive当前环境的参数值,但仅对本次连接有效 set 参数名 = 值; 如: hive> set mapred.map.tasks;
mapred.map.tasks=2;



hive job优化
1、并行优化 hive job的并行化执行,在job之间没有依赖关系时可以同时执行,并行数另外配置,默认为8,开启并行会消耗更多的集群资源来提高执行速度,可对特定作业作并行执行合适。 hive.exec.parallel=true; Job并行最大数,与job并行配置配合使用,但受集群资源与Job之间是否依赖的因素影响,即最大数为64但资源稀缺或存在不依赖的job数不够也无法达到最大值。 hive.exec.parallel.thread.number=8
2、本地模式优化(减低网络IO的负载,对小任务有用,大任务还得分而治之) hive.exec.mode.local.auto=true; 当一个job满足如下条件会使用本地模式: ①job的输入数据大小必须小于:         hive.exec.mode.local.auto.inputbytes.max  (默认128) ②job的map数必须小于参数:         hive.exec.mode.local.auto.tasks.max  (默认4) ③job的reduce数必须为0或者1
3、job合并输入小文件(会启动新的job合并文件) hive.merge.smallfiles.avgsize=256000000; 当输出文件平均大小小于该值,启动新job合并文件 hive.merge.size.per.task=64000000; 合并之后的文件大小
4.jvm重利用 mapred.job.reuse.jvm.num.tasks=20; JVM重利用可以使job长时间保留slot(下个map无需再次初始化jvm),直到作业结束,这个对于较多任务和较多小文件的任务是非常有意义的,减少执行时间。当然这个值不能设置过大,因为有些作业会有reduce任务,如果reduce任务没有完成,则map认为占用的slot不能释放,其他的作业可能就需要等待。
5、压缩数据 中间压缩就是处理hive查询的多个job之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式 hive.exec.compress.intermediate=true;//决定查询的中间 map/reduce job (中间 stage)的输出是否为压缩格式
hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; //中间 map/reduce job 的压缩编解码器的类名(一个压缩编解码器可能包含多种压缩类型),该值可能在程序中被自动设置。
hive.intermediate.compression.type=BLOCK  (压缩单元为块压缩) //中间 map/reduce job 的压缩类型,如 "BLOCK""RECORD"
hive查询最终的输出也可以压缩 hive.exec.compress.output=true; //决定查询中最后一个 map/reduce job 的输出是否为压缩格式 mapred.output.compression.codec=orgapache.hadoop.io.compress.GzipCodec;  // 压缩格式 mapred.output.compression.type=BLOCK  //压缩类型
6、Map优化
mapred.map.taskes=10; (1)默认map个数 default_num = total_size / block_size; (2)期望大小 goal_num = mapred.map.casks; (3)设置处理的文件大小 split_size = max(mapred.min.split.size,block_size); split_num = total_size / split_size; (4)计算的map个数 compute_map_num = min(split_num,max(default_num,goal_num));
 经过以上的分析,在设置map个数的时候,可以简单的总结为一下的几点: (1)如果增大map个数,则设置mapred.map.tasks为一个较大的值 (2)如果想减小map个数,则设置mapred.min.split.size为一个较大的值。
情况1:输入文件size巨大,但不是小文件) 增大mapred.min.split.size的值 情况2:输入文件数量巨大,且都是小文件,就是单个文件的size小于blockSize。(造成网络负载大) 这种情况通过增大mapred.min.split.size不可行,需要使用CombineFileInputFormat将多个input path合并成一个InputSplit送个mapper处理,从而减少mapper的数量

map端聚合(执行combine) hive.map.aggr=true; //消耗更多的内存来提高效率 推测执行(多启动一个map来防止map失败) mapred.map.tasks.speculative.execution
mapred.map.tasks.speculative.execution=true
mapred.reduce.tasks.speculative.execution=true
hive.mapred.reduce.tasks.speculative.execution=true;
7、Hive Shuffle优化
Map端
Reduce端
io.sort.mb io.sort.spill.percent min.num.spill.for.combine io.sort.factor io.sort.record.percent
mapred.reduce.parallel.copies mapred.reduce.copy.backoff io.sort.factor mapred.job.shuffle.input.buffer.percent mapred.job.reduce.input.buffer.percent



8、Hive Reduce优化
(1)设置reduce数 mapred.reduce.tasks = 10  (设置了也未必全用,使用个数公式如下) hive.exec.reducers.max 默认999 hive.exec.reducer.bytes.per.reducer 默认:1G
reduce使用个数的计算公式 numRTasks = min [ maxReducers,input.size / perReducer ] maxReducers = hive.exec.reducers.max perReducer = hive.exec.reducers.bytes.per.reducer
(2)推测执行 mapred.reduce.tasks.speculative.execution hive.mapred.reduce.tasks.speculative.excution

9、数据倾斜优化 注意:如果hql使用多个distinct是无法使用这个参数去解决倾斜问题,可以改用sum()+group by解决
hive.optimize.skewjoin  //是否优化数据倾斜的 Join,对于倾斜的 Join 会开启新的 Map/Reduce Job 处理。 

数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。第一个MRJob 中,
Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key
有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到
Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。
   默认值:false      hive.skewjoin.key    //倾斜键数目阈值,超过此值则判定为一个倾斜的 Join 查询。    默认值: 1000000      hive.skewjoin.mapjoin.map.tasks  //处理数据倾斜的 Map Join 的 Map 数上限。    默认值: 10000      hive.skewjoin.mapjoin.min.split  //处理数据倾斜的 Map Join 的最小数据切分大小,以字节为单位,默认为32M。    默认值:33554432     
参考:http://www.cnblogs.com/yshb/p/3147710.html 参考:http://www.aboutyun.com/thread-7794-1-1.html 参考:http://blog.csdn.net/w13770269691/article/details/17232947
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。