一、Map阶段:
  a. 文件切片之后,每一个切片对应一个MapTask

  b. 在MapTask中,默认按行读取,每读取一行,就调用一次map方法

  c. map方法在执行的时候会将结果(这个结果中已经包含了分区信息)写到MapTask自带的缓冲区中。注意:每一个MapTask都会自带一个缓冲区
  d. 当数据放到缓冲区中之后,数据在缓冲区中会进行分区(partition)、排序(sort)(扩展:在缓冲区中排序使用的排序算法是快速排序)。如果指定了合并类(combine),数据还会进行combine
  e. 缓冲区是维系在内存中,默认是100M
  f. 当缓冲区的使用达到指定条件(溢写阈值默认是0.8,即当缓冲区使用达到80%的时候会产生溢写)之后,MapTask会将这个缓冲区中的数据溢写(spill)到磁盘上产生溢写文件。后续的结果会继续写到缓冲区中。每一次溢写都会产生一个新的溢写文件
  g. 如果产生了多个溢写文件,那么会将多个溢写文件合并(merge)成1个final out文件。如果溢写之后,后续结果放入缓冲区中但是没有达到溢写阈值,而数据又处理完成,那么MapTask会将溢写文件中的结果和缓冲区的结果直接合并(merge)到最后的final out文件中

  h. 在merge过程中,结果会再次进行分区和排序,所以final out文件是整体分好区并且排好序
  i. 如果指定了合并类(Combiner),并且溢写文件的个数>=3个,那么在merge过程中会自动进行一次combine
  j. 注意问题:
     i. 溢写不一定产生
     ii. 溢写与否与输入的切片大小是没有直接关系
     iii. 溢写文件的大小要考虑序列化因素
     iv. 缓冲区本质上是一个字节数组,这个字节数组在底层做了改变,使缓冲区形成了一个环形的缓冲区。设置成环形的目的是为了减少寻址
     v. 溢写阈值的作用是为了减少阻塞
 二、Reduce阶段:
  a. 每一个ReduceTask都会启动fetch线程去MapTask中抓取当前要处理的分区的数据
  b. ReduceTask会将抓取过来的数据暂时放到文件中存储,从每一个MapTask中抓取的数据都会对应一个小文件
  c. ReduceTask会将这些小文件去合并(merge)成一个文件,在merge过程中,数据会进行排序 - 将局部有序变成整体有序 - merge过程中的排序使用的排序算法是归并排序
  d. merge完成之后,ReduceTask会将相同的键对应的值放到一块产生一个迭代器,这个过程从称之为分组(group)
  e. 每一个键调用一次reduce方法,reduce方法将结果写到HDFS上
  f. 注意问题:
     i. 默认fetch线程的数量为5
     ii. fetch线程通过HTTP请求的方式去抓取数据
     iii. merge因子默认为10,表示每10个小文件合成一个大文件
     iv. ReduceTask阈值默认为0.05,即当有5%的MapTask执行结束,就启动ReduceTask开始抓取数据
 三、Shuffle调优:
  a. 调大缓冲区,实际生产环境中一般将这个值调为250~400M
  b. 调大溢写阈值,可以减少和磁盘的交互但是同时增大了阻塞的概率
  c. 实际生产环境中,尽量增加Combine过程
  d. 可以对final out文件进行压缩。这种方案是对网络资源的一种取舍。如果网络资源紧张可以考虑这种方式
  e. 增多fetch线程的数量
  f. 增大merge因子 - 不建议
  g. 减小ReduceTask的阈值

推荐使用的方法是acde

最新文章

  1. 再见Windows C++
  2. javascript基本对象
  3. 微信接口php
  4. Linux下man安装及使用方法
  5. python实现监控URL的一个值小于规定的值--邮件报警
  6. 常用RSS订阅地址
  7. nginx配置说明
  8. Python中docstring文档的写法
  9. Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!具体解释!)
  10. HTML5新属性
  11. jspsmart(支持中文下载)
  12. celery学习笔记2
  13. 多选ui实现单选效果
  14. Android学习之基础知识三(Android日志工具Log的使用)
  15. STM32学习之路入门篇之指令集及cortex——m3的存储系统
  16. 数学:莫比乌斯反演-GCD计数
  17. php的无刷新实现方法
  18. 数据库初识--从MySQL 出发
  19. 如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间
  20. Dom4j解析和sax解析xml

热门文章

  1. Luogu P4171 [JSOI2010]满汉全席 2-sat
  2. 【鸽】poj3311 Hie with the Pie[状压DP+Floyd]
  3. 多对多第三张表的创建方式 和 forms组件的使用
  4. Codeforces Round #395 Div.1 C pacifist【JZOJ5449】Pacifist
  5. 【leetcode】1232. Check If It Is a Straight Line
  6. JS实现 Tab栏切换案例
  7. 关于Environment类的使用
  8. ubuntu1804 安装Nvidia驱动-nvidia-docker
  9. Python天天学_05_模块
  10. asp.net 怎么上传文件夹啊,不传压缩包!