MapReduce学习重点问题解答

1.什么是MapReduce?

        MapReduce是一个分布式、并行处理的计算框架。 

主要的两个阶段:

        1.Map阶段:在这个阶段中,数据被分成小块,每个小块由一个Map任务处理,每个Map任务将输入数据转换成中间数据。

        2.Reduce阶段:在这个阶段,已经处理的中间数据根据他们的键被分组在一起,每个组由一个reduce任务处理,reduce任务对这些数据进行进一步处理,通常用于生成最终结果或聚合数据。

 MapReduce的设计思想有:

  • 分而治之
  • 抽象模型
  • 统一架构
  • 离线框架
  • 计算向数据靠拢
  • 顺序处理数据、避免随机访问数据
  • 失效被认为是常态

2.Split切片概念

  • 切片是一个逻辑概念 在不改变现在数据存储的情况下,可以通过改变切片大小控制参与计算的节点数目。
  • 一般切片大小为Block的整数倍(2,1/2)
  • 默认情况下,Split切片的大小等于Block的大小 ,默认128M
  • 一个切片对应一个MapTask

3.MapReduce计算流程

         首先目标文件被分块存在HDFS上,每个快有128M大小。为了动态控制参与计算的节点数目,我们采用切片split为单位处理数据,一般切片大小为block的整数倍(1或1/2),而一个切片对应一个MapTask。

        切完片之后每个split切片会生成一个计算任务(MapTask),读取的数据的格式是以KV形式,K表示行偏移量,V表示一行数据,写入到MapTask的环形缓冲区中。

环形缓冲区:

        Map默认从所属切片读取数据,每次读取一行到内存中,但是要完全读入到内存中很难实现,因为内存大小有限而且执行多个任务可能会有OOM问题,因此我们在内存中写入一部分数据,然后写出到硬盘。 所以我们可以利用环形数据缓冲区,循环利用这块内存区域,减少数据溢写时map的停止时间。这个环形数据缓冲区,默认大小为100M,设置缓冲区的阈值为80%,当缓冲区的数据达到80m开始向外溢写到硬盘,溢写的时候还有20M的空间可以使用,并不会减缓效率,而且将数据循环写出到硬盘,不用担心OOM问题。

        Map从对应的切片读取数据时,默认的读取器每次从Block读取一行数据,我们可以根据自己书写的分词逻辑(空格分隔)计算每个单词出现的次数。

       在环形缓冲区达到溢写阈值时会溢写出一个数据文件,将溢写出的数据写入到磁盘中,进行一个合并处理(默认是最大是10个合并一次,主要减少了文件数量,相当于减少了IO次数)然后可以选择Combiner(Map预聚合用户自定义设置,每次spill溢写会被调用,合并文件超过三个会被调用,使用组合器也是减少了传输的数据量,节省了带宽)。

       随后ReduceTask会将MapTask写出的数据拉取到ReduceTask,将数据写入到内存中的环形缓冲区时先使用归并算法进行归后溢写。

      

4.Yarn架构工作流程:

        首先确认执行 MapReduce 作业的运行时框架,根据mapreduce.framework.name变量进行配置:

        如果等于 yarn :则创建 YARNRunner 对象;

        如果等于 local :则创建 LocalJobRunner 对象。

如果是yarn平台,客户端将对ResourceManager发起提交作业请求,具体流程如下:

1.Client对ResourceManager发起提交作业请求;

2.ResourceManager返回JobID和保存数据资源(作业的 Jar 文件,配置文件,计算所得输入分片,资源信息等)的临时目录 (使用 JobID 命名的目录,hdfs://xxx/staging/xxx);

3.接着Client计算分片,拷贝资源到HDFS,最后用submitApplication函数提交job给RM;

4.RM接受submitApplication方法提交的job,并将其交给ResourceScheduler(调度器)处理;

5.ResourceScheduler选择一台NodeManager分配一个Container,在Container中开启ApplicationMaster进程;

6.首先 ApplicationMaster 向 ResourceManager 进行注册,这样用户可以直接通过ResourceManager 查看应用程序的运行状态。。最后 ApplicationMaster 初始化一定数 量的记录对象(bookkeeping)来跟踪 Job 的运行进度,并收集每个 Task 的进度和完成情况。直到运行结束:

7.ApplicationMaster收集计算后的输入分片情况来向ResourceManager申请对应的资源以运行Task。

8.ResourceManager通过资源调度器给job分配一些container用来执行Map任务或者Reduce任务或者其他任务(Spark,Flink)

9.ApplicationMaster分配Task给对应的Container

10.应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己。

  • ApplicationMaster 采用轮询的方式,通过 RPC 协议向 ResourceManager 申请和领取资源;
  • ApplicationMaster 申请到资源后,会与对应的 NodeManager 进行通讯,要求它启动 Container;
  • NodeManager为任务设置好运行环境(包括环境变量、Jar 包、二进制程序等)后,将 Task 启动命令写到一个脚本中,并通过运行 该脚本启动对应的任务;
  • 各个任务通过 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,方便 ApplicationMaster 随时掌握各个任务的运行状态,从而 可以在任务失败的时候重新启动任务;而Reducetask也会通过RPC协议向ApplicationMaster汇报自己的状态和进度,同时会反复询问ApplicationMaster哪些Map任务已经执行结束,如果得到了消息,就回去那个Map Task中获取结果并作为自己的输入。
  • 此期间,客户端会每秒轮询检测 ApplicationMaster,这样就会随时收到更新信息,这些信息可以通过 Web UI 来进行查看。
  • 除此之 外,客户端还会每 5 秒轮询检查 Job 是否完成,需要调用 Job 类下的 waitForCompletion() 方法,Job 结束后该方法返回。
  • 轮询时间 间隔可以通过 mapreduce.client.completion.pollinterval 进行设置。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值