合理设置参数,让集群飞起来~
参数 | 缺省值 | 描述 | |
---|---|---|---|
可单独使用 | set hive.execution.engine=tez; | 设置hive的计算引擎 | |
可单独使用 | set mapreduce.map.memory.mb=4096; | 设置每个map的内存 | |
可单独使用 | set mapreduce.reduce.memory.mb=4096; | 设置每个reduce的内存 | |
可单独使用 | set mapreduce.map.java.opts=-Xmx13106M; | 这个 Java 程序可以使用的最大堆内存数,一定要小于mapreduce.map.memory.mb | |
可单独使用 | mapreduce.reduce.java.opts | 可以使用的最大堆内存数,一定要小于mapreduce.reduce.memory.mb | |
可单独使用 | set hive.cli.print.header=true; | 辅助设置-打印表头 | |
可单独使用 | set hive.cli.print.current.db=true; | 辅助设置-显示当前数据库 | |
可单独使用 | set hive.exec.parallel=true; | 开启任务并行执行 | |
可单独使用 | set hive.exec.parallel.thread.number=8; | 同一个sql允许并行任务的最大线程数 | |
联合使用 | set hive.exec.dynamic.partition=true; | FALSE | 设置成true, 表示开启动态分区功能 |
set hive.exec.dynamic.partition.mode=nonstrict; | strict | 设置成nonstrict, 表示允许所有分区都是动态的 | |
set hive.exec.max.dynamic.partitions.pernode=1000; | 100 | 每个mapper或reducer可以创建的最大动态分区个数.如果某个mapper或reducer尝试创建大于这个值的分区的话则会知出一个致命错误 | |
set hive.exec.max.dynamic.partitions=1000; | 1000 | 一个动态分区创建语句可以创建的虽大动态分区个数,如果超过这个佳则会抛出—个致命错误 | |
hive.exec.max.created.files | 100000 | 全局可以创建的最大文件个数.有一个Hadoop计数器会跟踪记录创速了多少个文件 | |
可单独使用 | set mapred.reduce.tasks=100; | 设置reduce数量, mapper数量:reduce数量 = 10:1 | |
可单独使用 | set hive.exec.reducers.bytes.per.reducer=500000000; (500M) | 设置每个reduce处理数据量,默认1G | |
联合使用 | set mapred.max.split.size=256000000; | 每个Map最大输入大小,间接设置map个数,默认256M就比较好。 | |
set mapred.min.split.size=100000000; | 每个Map最小输入大小 | ||
set mapred.min.split.size.per.node=100000000; | 一个节点上split的至少的大小 | ||
set mapred.min.split.size.per.rack=100000000; | 一个交换机下split的至少的大小 | ||
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; | 执行Map前进行小文件合并,前面参数确定合并文件块的大小 | ||
可单独使用 | set hive.merge.mapfiles=true; | 在Map-only的任务结束时合并小文件 | |
可单独使用 | set hive.merge.mapredfiles = true; | 在Map-Reduce的任务结束时合并小文件 | |
可单独使用 | set mapreduce.job.reduce.slowstart.completedmaps=0.9 | 0.8 | reduce任务从map完成80%后开始执行 集群默认0.8,大部分比较小的job都是适合的,对于map比较重的大job,这个值可以适当调大,比如0.9 |
可单独使用 | set hive.exec.reducers.bytes.per.reducer=500000000; | 1000000000 | 每个reduce处理的数据量,间接设置reduce的个数 |
可单独使用 | set hive.exec.reducers.max=999; | 设置最大reduce的个数 | |
可单独使用 | set mapred.reduce.tasks=10; | 直接设置reduce的个数,reduce个数并不是越多越好!Order by时只有一个reduce |
如果你懒得看上文,推荐一套参数设置: set hive.execution.engine=tez; set mapreduce.map.memory.mb=8192; set mapreduce.reduce.memory.mb=8192; set hive.exec.reducers.max=999; set hive.exec.reducers.bytes.per.reducer=500000000;
开动态分区时设置: set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; set hive.exec.max.dynamic.partitions.pernode=1000; set hive.exec.max.dynamic.partitions=1000;
【小编废话】
在日常开发中,还需要结合集群的实际情况,任务的差异性,结合任务日志,针对性的调整参数,两个原则:
原则1:当资源紧张时,重要任务优先(需结合调度时间优化)。
原则2:在保证原则1的前提下,提升整个集群的效率。当时效要求高时,尽量压缩总体运行时间;当稳定性要求更高时,错峰执行,负载均衡。
参数调优核心总结为两个字:平衡。
1、时效和稳定性的平衡;
2、资源的平衡,在某一时间点,集群的内存、io、cpu等负载均衡。