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增加,文档有建议参数






原文地址:https://www.cnblogs.com/wanghzh/p/14927434.html