开启mapjoin
set hive.auto.convert.join = true ;
// mapJoin优化是否自动启动set hive.mapjoin.smalltable.filesize = 25000000;
//广播小表的最大数据量字节数150M
mapjoin是由两个参数控制的:
- mapJoin优化是否自动启动;
- 如果在启动的情况下,小表数据量在多少M以内会进行广播
为什么系统自动设置为<150M?
历史原因:
大数据—>集群—>每台机器不是特别好—>基于当前的硬件环境,经过测试得出参数值—>随着硬件的发展—->人为调整参数值
spark —- 这几年产生的框架,默认参数是符合当前硬件环境的,大多数默认参数可以用
hadoop, hive —- 基于以前历史硬件环境设置的参数,在开发hadoop,hive时,一般要做参数优化,让程序能默认参数能够符合当前的硬件环境
mapTask并行度
dfs.block.size = 128M ;
mapreduce.input.fileinputformat.split.minsize = 1 ;
mapreduce.input.fileinputformat.split.maxsize = Long.MAX_VALUE ;
long splitSize = Math.max(minsize,Math.min(maxsize,blockSize));
—-> = blockSize = 128M
MapTask的并行度由block个数决定:
问 :因为需求的原因,每个mapTask执行128M数据延迟还是比较高,怎么解决?
让每个mapTask处理更少的数据;
把 splitSize 参数调整成64M,一个128M block 不会被切分成2个block块,但会有两个mapTask
mapTask1:从0字节开始到64M字节结束;
mapTask2:从64M字节开始到128M字节结束; (一个节点里面可以有多个mapTask同时执)
mapTask是一个Java程序,可设置jvm重用:set mapred.job.reuse.jvm.num.tasks = 5 ;
(mapTask,reduceTask可以运行在一个节点里)
小文件合并
程序为什么执行缓慢?
- 资源不断的申请和释放 —-申请资源需要时间,浪费资源还浪费时间
- 数据倾斜
优化:
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
//在mapTask执行前(逻辑型)合并小文件
set hive.merge.mapfiles = true;
//map端结束后合并小文件
set hive.merge.mapredfiles = false;
//mapReduce结束后作合并,减少小文件产生
set hive.merge.size.per.task = 256*1000*1000;
reduceTask的个数会决定程序执行效率
set mapreduce.job.reduces = 值;
//设置reduceTask的个数(0.95 * datanode个数)Combiner操作是可选的
set hive.map.aggr = true ;
//是否在map端进行局部聚合set hive.groupby.mapaggr.checkinterval = 10000;
//Map端聚合数据的条目个数提高并行度
(maptask,reducetask)
set hive.exec.parallel = true;
set hive.exec.parallel.thread.number = 8;
//同一个sql语句允许最大的并行任务数