(1) 资源分配
Mapredue的最小资源单元为container,container包括memory及vcores,所以直接与mapreduce挂钩的资源在yarn上是container,下面是具体的container及mapreduce资源占用设置:
Container:(配置在hadoop的yarn-site.xml里配置)
配置文件 配置项名称 配置项值
yarn-site.xml yarn.nodemanager.resource.memory-mb = Containers个数* 每个Container内存,机器总内存
yarn-site.xml yarn.scheduler.minimum-allocation-mb = 每个Container内存
yarn-site.xml yarn.scheduler.maximum-allocation-mb = Containers个数* 每个Container内存
mapred-site.xml mapreduce.map.memory.mb = 每个Container内存
mapred-site.xml mapreduce.reduce.memory.mb = 2 * 每个Container内存
mapred-site.xml mapreduce.map.java.opts = 0.8 * 每个Container内存
mapred-site.xml mapreduce.reduce.java.opts = 0.8 * 2 * 每个Container内存
yarn-site.xml (check) yarn.app.mapreduce.am.resource.mb = 2 * 每个Container内存
yarn-site.xml (check) yarn.app.mapreduce.am.command-opts = 0.8 * 2 * 每个Container内存
yarn监控界面中可以在如下位置看到资源分配(自己服务器是默认值,没做配置):
(2) mapreduce的map切分设置(reduce同理):
每个map内存设置(单位为B):
set mapred.max.split.size=50000000;
set mapred.min.split.size.per.node=50000000;
set mapred.min.split.size.per.rack=50000000;
这样就能控制我们map的切分大小为大约50m
(3) 控制任务并行:
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;
对于没有依赖的任务并行执行,例如union all,有显著优化效果,第二个参数主要控制任务并发数
(4) 数据倾斜参数优化:
1:如果是group by过程出现倾斜 应该设置为true
Set hive.groupby.skewindata=true;
2:group时预先取100000条数据聚合,如果聚合后的条数/100000>0.5,则不再聚合
hive.groupby.mapaggr.checkinterval = 100000 (默认)hive.map.aggr.hash.min.reduction=0.5(默认)
3:如果是join 过程出现倾斜应该设置为true
Set hive.optimize.skewjoin=true;
4:这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
Set hive.skewjoin.key=100000;
5:map join,一般出现数据倾斜都是在reduce端,如果在map端就做了join会很好的避免问题的出现
set hive.auto.convert.join=true;(目前版本这个参数是默认打开的)
set hive.mapjoin.smalltable.filesize=25000000;(如果join时小表大小小于该阀值,会自动进行map join,我们也可以控制这个阀值,达到优化目的)
6:数据倾斜问题原因:数据在join时存在笛卡尔积,空值或重复值过多,所以在数据处理时最好先做好数据过滤,清洗
(5) Jvm重用:
set mapred.job.reuse.jvm.num.tasks=20,避免重复的关闭重启
(6) 本地模式:
set hive.exec.mode.local.auto=true;适合于数据量少的 操作