hadoop MapReduce总体工作机制简述

2023-11-13

问题导读:
1、如何理解MapTask运行机制?
2、如何理解Map阶段机制?
3、如何理解ReduceTask 工作机制?
4、如何理解MapReduce总体工作机制?



MapTask运行机制详解

整个Map阶段流程大体如图所示

简单概述

inputFile通过split被逻辑切分为多个split文件,
通过Record按行读取内容给map(用户自己实现的)进行处理,
数据被map处理结束之后交给OutputCollector收集器,对其结果key进行分区(默认使用hash分区),
然后写入buffer,每个map task都有一个内存缓冲区,
存储着map的输出结果,
当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,
当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,
生成最终的正式输出文件,然后等待reduce task来拉数据。

Map阶段详解

详细步骤:

1.首先,读取数据组件InputFormat(默认TextInputFormat)会通过getSplits方法对输入目录中文件进行逻辑切片规划得到splits,有多少个split就对应启动多少个MapTask。默认情况下split与block的对应关系默认是一对一。Block块默认大小是128M 那么split分割时也是按照128分割

2.将输入文件切分为splits之后,由RecordReader对象(默认LineRecordReader)进行读取,以\n作为分隔符,读取一行数据,返回<key,value>。Key表示每行首字符偏移值,value表示这一行文本内容。

3.读取split返回<key,value>,进入用户自己继承的Mapper类中,执行用户重写的map函数。RecordReader读取一行用户重写的map调用一次,并输出一个<key,value>。

4.Map输出的数据会写入内存,内存中这片区域叫做环形缓冲区,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。key/value对以及Partition的结果都会被写入缓冲区。当然写入之前,key与value值都会被序列化成字节数组。

环形缓冲区其实是一个数组,数组中存放着key、value的序列化数据和key、value的元数据信息,包括partition、key的起始位置、value的起始位置以及value的长度。环形结构是一个抽象概念。

缓冲区是有大小限制,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写。这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。

5.合并溢写文件:每次溢写会在磁盘上生成一个临时文件(写之前判断是否有combiner),如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个临时文件存在。当整个数据处理结束之后开始对磁盘中的临时文件进行merge合并,因为最终的文件只有一个,写入磁盘,并且为这个文件提供了一个索引文件,以记录每个reduce对应数据的偏移量。
至此map整个阶段结束。

[Shell] 纯文本查看 复制代码
?
1
2
3
4
5
6
7
8
9
mapTask的一些基础设置配置(mapred-site.xml当中社会):
设置一:设置环型缓冲区的内存值大小(默认设置如下)
mapreduce.task.io.sort.mb:100
设置二:设置溢写百分比(默认设置如下)
mapreduce.map.sort.spill.percent:0.80
 设置三:设置溢写数据目录(默认设置)
mapreduce.cluster.local.dir:${hadoop.tmp.dir}/mapred/local
 设置四:设置一次最多合并多少个溢写文件(默认设置如下)
mapreduce.task.io.sort.factor:10




个人理解—Map 输出数据到内存

map输出的数据写入环形缓冲区(内存),缓冲区的默认大小是100M(可修改)。
当数据达到阈值(默认0.8-可修改)时,环形缓冲区进行flash,
环形缓冲区:数据在输出的同时,数据也可以写入空余的空间内。
当flash的数据个数达到一定的数量时(默认4个)。对数据进行合并(merge)。

ReduceTask 工作机制

Reduce大致分为copy、sort、reduce三个阶段,
重点在前两个阶段。
copy阶段包含一个eventFetcher来获取已完成的map列表,
由Fetcher线程去copy数据,在此过程中会启动两个merge线程,
分别为inMemoryMerger和onDiskMerger,
分别将内存中的数据merge到磁盘和将磁盘中的数据进行merge。
待数据copy完成之后,copy阶段就完成了,开始进行sort阶段,sort阶段主要是执行finalMerge操作,纯粹的sort阶段,完成之后就是reduce阶段,调用用户定义的reduce函数进行处理。


Reduce阶段详解




详细步骤

1、Copy阶段,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求maptask获取属于自己的文件。

2、Merge阶段。这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活。merge有三种形式:内存到内存;内存到磁盘;磁盘到磁盘。默认情况下第一种形式不启用。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的文件。

3、合并排序。把分散的数据合并成一个大的数据后,还会再对合并后的数据排序。

4、对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。
个人理解----Reduce在Map拷贝数据

Map 输出的结果写入本地,reduce主动发出拷贝进程到Map端拷贝数据。
reduce获取大数据后,将数据写入内存,当数据达到阈值时进行flash.
当flash的个数达到一定的量时,进行合并,最终发送给reduce

MapReduce总体工作机制

map逻辑完之后,将map的每条结果通过context.write进行collect数据收集。在collect中,会先对其进行分区处理,默认使用HashPartitioner。
MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。

当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。

如果job设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整个模型中会多次使用。

哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等(求平均值绝不能用Combiner)。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。

Split对数据进行逻辑切分

hdfs数据块大小是128 ,split 逻辑切分数据块大小是128M
HDFS 128 是存储层面的概念,是切分数据的分界点。
split 128 是一个逻辑切分。
这两个128没有关系。

Shuffle阶段是在Map的输出到Reduce的输入
流程角度




内存角度

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hadoop MapReduce总体工作机制简述 的相关文章

随机推荐

  • 三十五、android adb命令详解

    cmd常用控制台1 清屏命令 cls2 列出当前目录详细信息 dir3 删除文件 del xxx txt android adb常用命令1 创建sdcardmksdcard 50M D sdcard img gt 创建一张容量为50M的SD
  • 微信小程序文字换行符

    在微信小程序开发中有一个需求是展示长文本 后端返回的数据包含了 n n let str 第一段 n n第二段 如果将这段文字直接赋值
  • Kali Linux-网络安全之-XSS 跨站脚本攻击原理及 DVWA 靶机的搭建

    XSS 跨站脚本攻击 使用 JavaScript 创建 Cookie JavaScript 可以使用 document cookie 属性来创建 读叏 及删除 cookie 例 1 JavaScript 中 创建 cookie 如下所示 d
  • Jupyter Lab入门到精通

    Jupyter Lab Jupyter Notebook Jupyter Lab可以理解成Jupyter Notebook的升级版本 升级增加了很多功能 其支持python R java等多种编程语言及markdown letex等写作语言
  • MATLAB学习笔记:

    MATLAB学习笔记 MATLAB 变量命名规则 变量名区分大小写 变量名长度不超过63位 变量名以字母开头 可以由字母 数字和下划线组成 但不能使用标点 变量名应简洁明了 通过变量名可以只管看出所表示的物理意义 ch5 C textsca
  • Pytorch基础学习(第一章-PyTorch基础概念)

    课程一览表 目录 一 pytorch简介 二 环境配置 1 pycharm 2 annaconda 3 安装pytorch
  • altium designer芯片引脚间距规则过小

    AD中芯片的引脚间距过小 例如stm32这种MCU 引脚又细又密 违反了默认间距规则 如上图所示的16mil 而触发绿色的报错 但是我们又不能因噎废食 而把整个PCB规则间距改大 因此最好的解决方案是 只修改这一个芯片的间距规则 依次点击
  • 云汉芯城js逆向分析-v,t,s参数

    介绍 查看搜索的接口 很明显需要这几个参数 keyword 2N7002 搜索输入的关键词 font ident 945a41f33fc9693c 如下图 第一次访问的页面 返回的html里找 v 1655799627669 时间戳 t 1
  • Android平台GB28181设备接入模块相关博客概览

    Android平台GB28181设备接入模块 可实现不具备国标音视频能力的 Android终端 通过平台注册接入到现有的GB T28181 2016服务 可用于如智能监控 智慧零售 智慧教育 远程办公 生产运输 智慧交通 车载或执法记录仪等
  • 从零开始 verilog 以太网交换机(六)帧处理单元设计与实现

    从零开始 verilog 以太网交换机 六 帧处理单元设计与实现 声明 博主主页 王 嘻嘻的CSDN主页 从零开始 verilog 以太网交换机系列专栏 点击这里 未经作者允许 禁止转载 侵权必删 关注本专题的朋友们可以收获一个经典交换机设
  • 数据结构——栈(stack)

    一 顺序栈 栈 stack 是一种运算受限的线性表 其限制是仅允许在表的一端进行插入和删除运算 这一端被称为栈顶 相对地 把另一端称为栈底 向一个栈插入新元素又称作进栈 入栈或压栈 它是把新元素放到栈顶元素的上面 使之成为新的栈顶元素 从一
  • java中如何从一个url的字符串中提取出ip、port等信息

    欢迎访问个人博客 德鲁大叔撸代码 项目中有一个功能是 把我生成的对账单推送到商户指定的sftp服务器上 要上传文件到sftp那必须的就有以下几个数据 sftp的ip sftp所指向的port sftp的用户名 sftp的密码 指定sftp上
  • 安装HP LaserJet 1320n打印机驱动

    该打印机型号比较老了 不是网络打印机 只能通过并口或USB安装 由于笔记本不带并口 现在台式机基本都不带了 只能选择USB安装 折腾了好久 才找到正确的安装方法 特分享给大家 首先 就是找到正确的驱动 我的笔记本是win8 64bit的 所
  • Ioc容器refresh总结(4)--- Spring源码从入门到精通(三十四 )

    上偏文章介绍了 registerBeanPostProcessor 分别按优先级顺序先注册PriorityOrdered和Ordered接口 第三部注册没有实现接口的beanPostProcessor 最后注册mergedBeanDefin
  • 特征选取1-from sklearn.feature_selection import SelectKBest

    sklearn实战 乳腺癌细胞数据挖掘 博主亲自录制视频 https study 163 com course introduction htm courseId 1005269003 utm campaign commission utm
  • 从入门到入土:[SEED-Lab]-SQL注入攻击

    此博客仅用于记录个人学习进度 学识浅薄 若有错误观点欢迎评论区指出 欢迎各位前来交流 部分材料来源网络 若有侵权 立即删除 本人博客所有文章纯属学习之用 不涉及商业利益 不合适引用 自当删除 若被用于非法行为 与我本人无关 SEED Lab
  • Flex 学习资源

    Action Script 3 0 帮助 http help adobe com zh CN ActionScript 3 0 ProgrammingAS3 Flex 实例 http blog minidx com 2009 04 06 2
  • 计算机文献汇报ppt,常见的研究生文献汇报.ppt

    常见的研究生文献汇报 Example two Fig 9 shows a schematic illustration of the synthesis routes of single molecular nano particles m
  • 《Android 开发艺术探索》笔记7--RemoteViews的内部机制和意义

    RemoteViews的内部机制和意义思维导图 RemoteViews的内部机制 RemoteViews的意义可以模拟一个通知栏效果并实现跨进程的UI更新 参看文章 RemoteViews的内部机制和意义思维导图 RemoteViews的内
  • hadoop MapReduce总体工作机制简述

    问题导读 1 如何理解MapTask运行机制 2 如何理解Map阶段机制 3 如何理解ReduceTask 工作机制 4 如何理解MapReduce总体工作机制 MapTask运行机制详解整个Map阶段流程大体如图所示简单概述inputFi