前言:

  Mapreduce程序的效率的瓶颈在于两点:

计算机性能:
  CPU、内存、磁盘健康、网络
I/O操作:
  数据倾斜
  map和reduce数量设置不合理
  map的运行时间太长,导致reduc的等待过久
  小文件过多
  大量的补课分块的超大文件
  spill(溢写)次数过多
  merge(合并)次数过多

MapReduce优化方法

  数据输入:

    (1)合并小文件:在执行任务前将小文件进行合并

    (2)采用CombineTextInputformat来作为输入,解决输入端大量小文件的场景。将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 maptask。     

      CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m

      CombineTextInputFormat.setMinInputSplitSize(job, 2097152);// 2m

      job.setInputFormatClass(CombineTextInputFormat.class)

  Map阶段:

    (1)减少溢写(spill)操作:通过调整 io.sort.mb 及 sort.spill.percent 参数值,增大触发spill 的内存上限,减少 spill 次数,从而减少磁盘 IO。

    (2)减少合并(merge)操作:通过调整 io.sort.factor 参数,增大 merge 的文件数目,减少 merge 的次数,从而缩短 mr 处理时间。

    (3)在不影响业务逻辑的前提下,先进行combine处理,减少I/O。

  Reduce阶段:

    (1)合理设置map和reduce的数量

    (2)设置map、reduce共存:调整 slowstart.completedmaps 参数,使 map 运行到一定程度后,reduce 也开始运行,减少reduce 的等待时间。

    (3)规避使用reduce

    (4)合理使用reduce端的buffer

  I/O传输:

    (1)采用数据压缩的方法,减少网络IO时间

    (2)使用sequenceFile二进制文件

  数据倾斜问题:

    (1)抽样和范围分区

    (2)自定义分区

    (3)Combine

    (4)采用Map join,尽量避免reduce join

  JVM重用:

    对于大量的小文件job,开启JVM重用会减少45%运行时间。 

    具体设置:mapreduce.job.jvm.numtasks 值在 10-20 之间。

    

 

最新文章

  1. 尝试在你浏览器的Console(F12)中运行一下,你会发现页面被不同的颜色块高亮了(css调试中学到的js)
  2. Github 与Git pages
  3. html5笔记
  4. Android 开发Project中各个目录和文件的介绍
  5. Codeforces Round #363 (Div. 2) 698B Fix a Tree
  6. JAVA HashMap详细介绍和示例
  7. 关于Look and Say序列的感想
  8. poj 3228 Gold Transportation 二分+网络流
  9. stm32之USART通信
  10. MySQL 表名和字段名不要使用保留字命名
  11. URL与URI的区别和联系
  12. EL 表达式截取字符串/替换字符/……
  13. UVa 572 油田 (dfs)
  14. 用python socket模块实现简单的文件下载
  15. php5.4安装fileinfo扩展
  16. HDU 2907
  17. java抽象类和普通类的区别
  18. Jmeter————监控服务器性能
  19. HDU 2239 polya计数 欧拉函数
  20. 短信API——短信验证码

热门文章

  1. Oracle通过序列+触发器实现主键自增
  2. Python学习第三章
  3. AssetBundle使用心得【资源加载】
  4. bash编程-Shell变量
  5. [Python] networkx入门 转
  6. 剑指offer编程题Java实现——面试题8旋转数组的最小数字
  7. python 使用unittest进行单元测试
  8. jzoj5929. 【NOIP2018模拟10.26】情书
  9. TensorFlow 神经网络教程
  10. 《分布式Java应用与实践》—— 后面两章