IT编程 > 数据库 > 其他数据库

MapReduce与Yarn 的详细工作流程分析

27人参与2019-10-09

mapreduce详细工作流程之map阶段

mr一

如上图所示

  1. 首先有一个200m的待处理文件
  2. 切片:在客户端提交之前,根据参数配置,进行任务规划,将文件按128m每块进行切片
  3. 提交:提交可以提交到本地工作环境或者yarn工作环境,本地只需要提交切片信息和xml配置文件,yarn环境还需要提交jar包;本地环境一般只作为测试用
  4. 提交时会将每个任务封装为一个job交给yarn来处理(详细见后边的yarn工作流程介绍),计算出maptask数量(等于切片数量),每个maptask并行执行
  5. maptask中执行mapper的map方法,此方法需要k和v作为输入参数,所以会首先获取kv值;
    • 首先调用inputformat方法,默认为textinputformat方法,在此方法调用createrecoderreader方法,将每个块文件封装为k,v键值对,传递给map方法
  6. map方法首先进行一系列的逻辑操作,执行完成后最后进行写操作
  7. map方法如果直接写给reduce的话,相当于直接操作磁盘,太多的io操作,使得效率太低,所以在map和reduce中间还有一个shuffle操作
    • map处理完成相关的逻辑操作之后,首先通过outputcollector向环形缓冲区写入数据,环形缓冲区主要两部分,一部分写入文件的元数据信息,另一部分写入文件的真实内容
    • 环形缓冲区的默认大小是100m,当缓冲的容量达到默认大小的80%时,进行反向溢写
  8. 在溢写之前会将缓冲区的数据按照指定的分区规则进行分区和排序,之所以反向溢写是因为这样就可以边接收数据边往磁盘溢写数据
  9. 在分区和排序之后,溢写到磁盘,可能发生多次溢写,溢写到多个文件
  10. 对所有溢写到磁盘的文件进行归并排序
  11. 在9到10步之间还可以有一个combine合并操作,意义是对每个maptask的输出进行局部汇总,以减少网络传输量
    • map阶段的进程数比reduce阶段要多,所以放在map阶段处理效率更高
    • map阶段合并之后,传递给reduce的数据就会少很多
    • 但是combiner能够应用的前提是不能影响最终的业务逻辑,而且combiner的输出kv要和reduce的输入kv类型对应起来

整个maptask分为read阶段,map阶段,collect阶段,溢写(spill)阶段和combine阶段

  • read阶段:maptask通过用户编写的recordreader,从输入inputsplit中解析出一个个key/value
  • map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value
  • collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用outputcollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用partitioner),并写入一个环形内存缓冲区中
  • spill阶段:即“溢写”,当环形缓冲区满后,mapreduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作

mapreduce详细工作流程之reduce阶段

mr二

如上图所示

  1. 所有的maptask任务完成后,启动相应数量的reducetask(和分区数量相同),并告知reducetask处理数据的范围
  2. reducetask会将maptask处理完的数据拷贝一份到磁盘中,并合并文件和归并排序
  3. 最后将数据传给reduce进行处理,一次读取一组数据
  4. 最后通过outputformat输出

整个reducetask分为copy阶段,merge阶段,sort阶段(merge和sort可以合并为一个),reduce阶段。

  • copy阶段:reducetask从各个maptask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中
  • merge阶段:在远程拷贝数据的同时,reducetask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多
  • sort阶段:按照mapreduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,hadoop采用了基于排序的策略。由于各个maptask已经实现对自己的处理结果进行了局部排序,因此,reducetask只需对所有数据进行一次归并排序即可
  • reduce阶段:reduce()函数将计算结果写到hdfs上

shuffle机制

map方法之后,reduce方法之前的数据处理过程称之为shuffle。shuffle流程详解如下:

  1. maptask收集map()方法输出的kv对,放到环形缓冲区中
  2. 从环形缓冲区不断溢出到本地磁盘文件,可能会溢出多个文件
  3. 多个溢出文件会被合并成大的溢出文件
  4. 在溢出过程及合并的过程中,都要调用partitioner进行分区和针对key进行排序
  5. reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据
  6. reducetask将取到的来自同一个分区不同maptask的结果文件进行归并排序
  7. 合并成大文件后,shuffle过程也就结束了,进入reduce方法

yarn工作机制

yarn工作机制

job提交全过程

  1. mr程序提交到客户端所在的节点,yarnrunner向resourcemanager申请一个application
  2. rm将该application的资源路径和作业id返回给yarnrunner
  3. yarnrunner将运行job所需资源提交到hdfs上
  4. 程序资源提交完毕后,申请运行mrappmaster
  5. rm将用户的请求初始化成一个task
  6. 其中一个nodemanager领取到task任务
  7. 该nodemanager创建容器container,并产生mrappmaster
  8. container从hdfs上拷贝资源到本地
  9. mrappmaster向rm 申请运行maptask资源
  10. rm将运行maptask任务分配给另外两个nodemanager,另两个nodemanager分别领取任务并创建容器
  11. mr向两个接收到任务的nodemanager发送程序启动脚本,这两个nodemanager分别启动maptask,maptask对数据分区排序
  12. mrappmaster等待所有maptask运行完毕后,向rm申请容器,运行reducetask
  13. reducetask向maptask获取相应分区的数据
  14. 程序运行完毕后,mr会向rm申请注销自己

进度和状态更新:

yarn中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户

作业完成:

除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitforcompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查

欢迎关注下方公众号,获取更多文章信息

1

您希望与广大热心网友互动!!点此进行留言回复

相关推荐

MapReduce与Yarn 的详细工作流程分析

10-09

数据库安装包和升级包脚本工具RedGate使用介绍

12-13

hadoop集群搭建及易踩坑收录

07-19

三表左连接查询的sql语句写法

08-04

BigData – Join中竟然也有谓词下推!?

04-25

mybatis映射XML文件详解及实例

12-01

大数据学习笔记【一】:Hadoop-3.1.2完全分布式环境搭建(Windows 10)

07-31

hadoop基本文件配置

08-28

CDH升级 5.7.5 --> 5.13.3(tar包方式)

06-01

基于 ZooKeeper 搭建 Hadoop 高可用集群

06-23

最近更新

数据存储检索之B+树和LSM-Tree

10-20

kylin从入门到实战:实际案例

10-18

NameNode && Secondary NameNode工作机制

10-18

2.InfluxDB-InfluxQL基础语法教程--目录

10-17

6.InfluxDB-InfluxQL基础语法教程--GROUP BY子句

10-17

9.InfluxDB-InfluxQL基础语法教程--LIMIT and SLIMIT 子句

10-17

Flink Time深度解析

10-16

Kylin构建Cube过程详解

10-16

Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)

10-14

Apache Kylin 概述

10-14

网友评论

已有0条评论