1)SQL
a)⾏列过滤
列处理:在 SELECT 中,只拿需要的列,如果有,尽量使⽤分区过滤,少⽤ SELECT * 。
11
⾏处理:在分区剪裁中,当使⽤外关联时,如果将副表的过滤条件写在 Where 后⾯, 那么就
会先全表关联,之后再过滤。
b)减少job数(例如相同的on条件的join放在⼀起作为⼀个任务)。
c)⼩表Join⼤表的时候要把⼩表放前⾯,原因是在Join操作的Reduce阶段,位于Join操作符左边的
表的内容会被加载进内存,将条⽬少的表放在左边,可以减少数据量,可以有效减少发⽣OOM错误的⼏率。
d)使⽤group by 代替 count distinct 完成计算。
e)优先过滤后再进⾏ Join 操作,最⼤限度的减少参与 join 的数据量
2)建表
a)创建分区表或者分桶表,避免全表查询
b)创建表是采⽤列式存储,例如orc或者parquet
3)参数
a)merge输出合并⼩⽂件
SET Hive.merge.mapfiles = true; -- 默认 true,在 map-only 任务结束时合并⼩⽂件
SET Hive.merge.mapredfiles = true; -- 默认 false,在 map-reduce 任务结 束时合并⼩⽂件
b)在 Map 执⾏前合并⼩⽂件,减少 Map 数:CombineHiveInputFormat 具有对⼩⽂件 进⾏合并
的功能(系统默认的格式)。HiveInputFormat 没有对⼩⽂件合并功能。
c)开启 map 端 combiner(不影响最终业务逻辑)
set Hive.map.aggr=true;
d)压缩(选择快的)
set Hive.exec.compress.intermediate=true --启⽤中间数据压缩 set
mapreduce.map.output.compress=true --启⽤最终数据压缩 set
mapreduce.map.outout.compress.codec=…; --设置压缩⽅式
e)合理设置 map数
mapred.min.split.size: 指的是数据的最⼩分割单元⼤⼩;
min 的默认值是 1B mapred.max.split.size: 指的是数据的最⼤分割单元⼤⼩;
max 的默认值是 256MB 通过调整 max 可以起到调整 map 数的作⽤,减⼩ max 可以增加
map 数,增⼤ max 可 以减少 map 数。 需要提醒的是,直接调整 mapred.map.tasks 这个参
数是没有效果的。
f)合理设置 Reduce 数 过多的启动和初始化 Reduce 也会消耗时间和资源;
另外,有多少个 Reduce,就会有多少个输出⽂件,