- 表之间的Join优化
表之间的join分为Map-side Join和Reduce-side Join
Map-side Join(Broadcast join)
Join操作在map task中完成,因此无需启动reduce task;
适合一个大表,一个小表的连接操作
思想:将小表复制到各个节点上,并加载到内存中;大表分片,与小表完成连接操作
Reduce-side Join(shuffle join)
Join操作在reduce task中完成;
适合两个大表连接操作
思想:map端按照字段进行hash,reduce端完成连接操作
- Map-side Join控制参数
在大部分情况如果可以使用MapJoin算法,尽量使用MapJoin算法,运行速度更快一些,那么如何控制MapJoin?
mapside join提示:
/* +mapjoin(small_table)*/:small_table表示需要广播的小表
如:select /* +mapjoin(user) */ 列名 from 表名 join ……
hive.ignore.mapjoin.hint
自动转换mapside join:
hive.auto.convert.join:默认为true,自动会广播小表
hive.mapjoin.smalltable.filesize;默认为25M,当表小于25M时会做广播,如果两个表都大于25M,不广播
内存控制:
hive.mapjoin.followby.gby.localtask.max.memory.usage;
set hive.mapjoin.localtask.max.memory.usage;
- MR阶段优化-Map阶段
num_map_tasks切割大小影响参数,设置这两个参数,可控制maptask的数量
mapreduce.input.fileinputformat.split.maxsize默认:INT-MAX
mapreduce.input.fileinputformat.split.minsize默认:0
dfs.block.size默认:128M
- MR阶段优化-Reduce阶段
mapreduce.job.reduces直接设置,设置为几个,启动的reduce就为几个,一般设置为-1,由hive自己判断启动多个个reduceTask
num_reduce_tasks大小影响参数
hive.exec.reducers.max默认:1099
hive.exec.reducers.bytes.per.reducer默认:1G
- MR阶段优化-Shuffle阶段
压缩中间数据;减少磁盘操作;减少网络传输数据量
配置方法:
mapreduce.map.output.compress设为true
mapreduce.map.output.compress.codec:压缩编码方式
org.apache.hadoop.io.compress.LzoCodec
org.apache.hadoop.io.compress.SnappyCodec
- 作业并发度设置
hive.exec.parallel=true(默认: false)
无依赖关系的job可并发执行(一个HQL可生成多个job)
hive.exec.parallel.thread.number=8(默认: 8)最多可执行的线程数量