MapReduce之MapTask工作机制
1. 阶段定义
MapTask
:map----->sort
map
:Mapper.map()中将输出的key-value
写出之前
sort
:Mapper.map()中将输出的key-value
写出之后
2. MapTask工作机制
Read阶段
MapTask通过用户编写的RecordReader
,从输入InputSplit
中解析出一个个key/value
。Map阶段
该节点主要是将解析出的key/value交给用户编写map()
函数处理,并产生一系列新的key/value。Collect收集阶段
在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()
输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner
),并写入一个内存缓冲区中,并且会被Partitioner
计算一个分区号,按照先后顺序分配index
下标Spill阶段
即“溢写”,在此阶段有两个重要线程。收集线程负责向缓冲区收集数据,缓冲区初始值为100M,当使用到80%阈值,唤醒溢写线程,溢写线程会将缓冲区已经收集的数据溢写到磁盘。
在溢写前,会对缓冲区中的数据进行排序(快速排序),在排序时,只通过比较key进行排序,只改变index的位置,不交换数据的位置
排序后,按照分区,依次将数据写入到磁盘的临时文件的若干分区中
每次溢写都会生成一个临时文件,当所有的数据都溢写完成之后,会将所有的临时文件片段合并为一个总的文件
- Combine阶段
在合并时,将所有的临时文件的相同分区的数据,进行合并,合并后再对所有的数据进行排序(归并排序)
最终生成一个结果文件(
output/file.out
),同时生成相应的索引文件output/file.out.index
,这个文件分为若干分区,每个分区的数据已经按照key进行了排序,等待reduceTask
的shuffle线程来拷贝数据!
溢写阶段详情:
步骤1:利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号Partition进行排序,然后按照key进行排序。这样,经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序。
步骤2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N表示当前溢写次数)中。如果用户设置了Combiner,则写入文件之前,对每个分区中的数据进行一次聚集操作。
步骤3:将分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中。
最新文章
- 未能加载文件或程序集“Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5”或它的某一个依赖项。系统找不到指定的文件。
- SSH三大框架笔面试总结
- linux tr命令详解
- Json数据,日期的转换
- Android小项目之三 splash界面
- linux进程模型总结
- I/O体系结构和设备驱动程序
- polay定理总结
- [BZOJ4907]柠檬
- LESS IS MORE
- Chapter 4 Invitations——18
- 2019最新迅为-i.MX6Q开发板资料目录
- IO流--字符流与字节流--File类常用功能
- PID控制器开发笔记之七:微分先行PID控制器的实现
- Python学习(二十) —— 前端之CSS
- Object类--toString方法
- MySQL笔记(七)远程连接MySQL
- CodeForces - 441E:Valera and Number (DP&;数学期望&;二进制)
- 【主成份分析】PCA推导
- idea 打包java程序
热门文章
- 提交代码到gitbub.com
- 一小时彻底搞懂RabbitMQ
- Javascript的单线程和异步编程
- webstom 汉化,激活
- 调用微信内置的方法及wx.config的配置问题
- 洛谷 P2648 赚钱
- Write a program to copy its input to its output, replacing each tab by \t, each backspace by \b, and each backslash by \\. This makes tabs and backspa
- day16 函数对象与闭包函数
- 【XCTF】ics-04
- Sql Or NoSql,看完这一篇你就懂了(转五月的仓颉)