job提交阶段

1、准备好待处理文本。

2、客户端submit()前,获取待处理数据的信息,然后根据参数配置,形成一个任务分配的规划。

3、客户端向Yarn请求创建MrAppMaster并提交切片等相关信息:job.split、wc.jar、job.xml。Yarn调用ResourceManager来创建MrAppMaster,而MrAppMaster则会根据切片的个数来创建MapTask。

其中切片规划: InputFormat(默认为TextInputFormat)通过getSplits 方法对输入目录中的文件进行逻辑切片,并序列化成job.split文件。默认情况下,HDFS上的一个block对应一个InputSplit,一个InputSplit对应开启一个MapTask。

MapTask阶段

1、Read阶段:由RecordReader对象(默认是LineRecordReader)进行读取,以换行符 (\n) 作为分隔符,每读取一行数据,就返回一对<Key,Value>供Mapper使用。Key表示该行的起始字节偏移量,Reduce表示这一行的内容。

2、Map阶段: 将解析出的<Key,Value>交给用户重写的map()函数处理,每一行数据会调用一次map()函数。

3、Collect阶段:map()函数中将数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value进行分区处理(调用Partitioner,默认为HashPartitioner),并写入一个环形内存缓冲区中。

4、Spill阶段(溢写):当环形缓冲区的数据达到溢写比例时(80%),会将数据溢写到本地磁盘上,生成一个临时文件。溢写之前,还会对数据进行排序,必要时进行合并、压缩操作。

5、Merge阶段:当Mapper输出全部文件后,产生多个临时文件。MapTask将所有临时文件以分区为单位,进行归并排序,最终得到一个大文件,等待Reduce端的拉取。

ReduceTask阶段

1、Copy阶段:每个ReduceTask从各个MapTask上拉取对应分区的数据。拉取数据后先存储到内存中,内存不够时,再刷写到磁盘。

2、Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。

3、Sort阶段:用户编写的reduce()函数的输入数据是按Key进行聚集的一组数据。为了将相同Key的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经对自己的处理结果进行了分区内局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。

4、Reduce阶段:相同Key的一组键值对调用一次Reduce方法,进行聚合处理。之后通过context.write,默认以TextOutputFormat格式经RecordWriter写入到HDFS文件中。

溢写阶段详情

1、每个 MapTask都有一个环形内存缓冲区(默认大小为100M)用于批量收集Mapper结果,以减少磁盘IO的开销。当缓冲区的数据达到溢写比例时(默认为80%),溢写线程启动。此时MapTask仍继续将结果写入缓冲区,如果缓冲区被写满,MapTask就会阻塞直到溢出线程结束。如果数据量很小,达不到80M溢写的话,就等所有文件都读完后完成一次溢写。

2、在溢写之前,会采取快速排序算法对缓冲区内的数据按照Key进行字典顺序排序:先把数据划分到相应的分区(Partition),然后按照key进行排序。经过排序后,相同分区的数据聚集在一起,同一分区内的数据按照key有序。

3、如果设置了Combiner 函数,则在排序后,溢写前对每个分区中的数据进行局部聚合操作,以减轻 Shuffle 过程中网络传输压力。

4、开始溢写:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N表示当前溢写次数)中。每次内存缓冲区达到溢出阈值,就会新建一个溢出文件(spill file),当Mapper输出全部文件时,会产生多个溢写文件,最终会被合并成一个已分区且已排序的输出文件。

最新文章

  1. MYSQL数据库相关知识合集
  2. 如何在移动设备上调试html5开发的网页
  3. 上传图片插件鼠标手cursor:pointer;不生效
  4. Java中的引用类型(强引用、弱引用)和垃圾回收
  5. We have detected that MySQL products under the Commercial license are installed. In order to proceed with this GPL installation these Commercial
  6. Got a packet bigger than &#39;max_allowed_packet&#39; bytes
  7. Winform 控件
  8. 用Chrome devTools 调试Android手机app中的web页面。
  9. [LeetCode] 57. Insert Interval 解决思路
  10. Mysql 常用查询语句
  11. nginx 区分pc和mobile 到不同的404页面
  12. 使用Nginx+CppCMS构建高效Web应用服务器
  13. HTTP消息中Header头部信息整理
  14. 用ESP8266+android,制作自己的WIFI小车(Android 软件)
  15. 微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅
  16. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)
  17. CentOS 使用yum命令安装出现错误提示”could not retrieve mirrorlist http://mirrorlist.centos.org
  18. Luogu3209 HNOI2010 平面图判定 平面图、并查集
  19. BlurZoomGallery一个完美下拉进入大图模式
  20. 愿你走出半生,归来仍是Java Parser

热门文章

  1. PAT A1001 A+B Format
  2. win11拖动窗口造成崩溃的问题
  3. 02 | 自己动手,实现C++的智能指针
  4. 【jenkins】04.SSH认证方式拉取Git代码
  5. ADO访问Excel
  6. 纯css 实现充电动画
  7. 简单手写一个jqurey
  8. WinUI使用LiteDB做个女演员图鉴
  9. v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码
  10. JS获取Cookie失败