MapReduce之MapTask工作机制
时间:2022-07-22
本文章向大家介绍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中。
- 1084: [SCOI2005]最大子矩阵
- 关于一般的并查集求根操作的一组对照研究
- vue计算属性详解——小白速会
- 【技巧】Java工程中的Debug信息分级输出接口及部署模式
- 1934: [Shoi2007]Vote 善意的投票
- 算法模板——线段树8 (字符串回文变换)
- 算法模板——哈希单模板字符串匹配
- javascript 原型及原型链详解
- 算法模板——并查集 2(支持快速即时查询本连通块内容,纯原创!)
- 1707: [Usaco2007 Nov]tanning分配防晒霜
- JavaScript 图片的上传前预览(兼容所有浏览器)
- 算法模板——sap网络最大流 3(递归+邻接表)
- BZOJ4819: [Sdoi2017]新生舞会(01分数规划)
- 3401: [Usaco2009 Mar]Look Up 仰望
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在Linux中使用history命令的方法
- Linux服务器部署JavaWeb项目完整教程
- centos 6 安装vsftpd与PAM虚拟用户的方法
- CentOS6.8中/英文环境切换教程图解
- centos7.6 安装Tomcat-8.5.39的方法
- ubuntu14.04安装jdk1.8的教程
- Linux nohup实现后台运行程序及查看(nohup与&)
- 详解Linux 服务管理两种方式service和systemctl
- CentOS6.5安装python3.7详细步骤
- Centos7.5配置IP地址的实现
- linux里daily_routine实例代码详解
- 类Linux环境安装jdk1.8及环境变量配置详解
- CentOS7yum安装PHP7.2的操作方法
- CentOS 7中 Apache Web 服务器安装配置教程
- Win10安装Linux系统的教程图解