MapReduce 优化
Job 执行原则:
- 1.尽可能让任务并发执行,合理控制maptask和reducetask数量
- 2.尽量让所有reduceTask在同一轮完成
- 3.task的执行时间要合理,maptask 和reducetask的执行时间尽量靠近1min
shuffle调优:
Map 端调优:
查看yarn web界面19888 端口,点击左侧counters,Map-Reduce Framework
CPU time spent
GC time elapsed 当 GC/CPU <10% 说明当前maptask运行时间合理,
内存分配合理
maptask 默认1核 1G
如果GC占比高,可以调高内存
如果集群资源充足,maptask 内存给3G,cpu核数1
环形缓冲区大小调到512M,mapreduce.task.io.sort.mb=512
默认一次合并10个文件,可以调整到64 ,mapreduce.task.io.factor=64
Combine:
map端预聚合动作,不影响业务的情况下可以加
reduce端调优:
- 压缩
- reducetask 默认也是1核1G,一般reducetask 给5G的内存
- reducetask 默认拉取数据是5个并行度,一般可以设置到50~100,mapreduce.reduce.shuffle.parallelcopies=100
- 可以调整 reducetask 缓冲区大小,mapreduce.reduce.shuffle.input.buffer.percent(default 0.7)
- reducetask 多次溢写后,要进行归并排序,默认10个归并排序一次 ,通过修改mapreduce.task.io.sort.factor =100
- 推测执行:10个以下节点的集群关闭(推测执行,防止某一个节点故障,复制task去其它节点运行)
mapreduce.map.speculative
mapreduce.reduce.speculative
控制maptask执行到百分比(默认是所有maptask执行完,即100%),启动reducetask
开启该参数,默认是5%,mapreduce.job.reduce.slowstart.completedmaps
小文件优化:
- 1.从源头,进入到hdfs就合并成大文件
- 2.通过mr 合并 hdfs的小文件
- 3.通过combineInputformat
数据倾斜:
- 1.结合业务自定义分区
- 2.key前加 随机数 key-n
某个mr跑的慢,采用推测执行,防止节点故障
YARN 调优:
- yarn.nodemanager.resource.memory-mb 默认是8192
- yarn.nodemanager.resource.cpu-vcores
该节点上YARN可使用的虚拟CPU个数,默认是8。
目前推荐将该值设值为逻辑CPU核数的1.5~2倍之间
- yarn.app.mapreduce.am.resource.mb =10G
如果有几百上千的task数量,可以这么设置,增加ApplicationMaster 的内存大小
Namenode Full GC:
产生原因:
老年代有过多的长期存活对象导致的
full gc的时候,namenode无响应,导致hdfs集群无法使用
查看:
jstat -gc -t pid 1s
FGC full gc 次数
解决方案:
修改namenode内存大小,同时合并小文件
<100w 1G,100w 1g增加,文档有建议参数