场景: 执行hive sql,占用的内存资源特别多, 如何去减少占用的内存 cpu资源.
执行的sql只是做了一下group by操作。
步骤1:
减少map数量,合并小文件
set mapreduce.input.fileinputformat.split.maxsize=1500000000
set mapreduce.input.fileinputformat.split.minsize=800000000
set mapreduce.input.fileinputformat.split.minsize.per.node=800000000
set mapreduce.input.fileinputformat.split.minsize.per.rack=800000000
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat #执行 Map 前进行小文件合并
步骤2:
减少reduce数量
hive.exec.reducers.bytes.per.reducer 默认是1G,输入文件如果是10G,那么就会起10个reducer
hive.exec.reducers.max(每个sql任务最大的reduce数,默认为999)
mapred.reduce.tasks 设置固定的reduce数量
步骤3:
hive.groupby.skewindata:
group by操作是否允许数据倾斜,
默认是false,
当设置为true时,执行计划会生成两个map/reduce作业,第一个MR中会将map的结果随机分布到reduce中,达到负载均衡的目的来解决数据倾斜
结果:
从 原来的32个containers 32个cpu 32G内存
变成了现在6个containers 6个CPU 6G内存