MapReduce详细工作流程解析

一.流程示意图

在这里插入图片描述

二.流程详解

1.split阶段

首先mapreducec会根据要运行的大文件来进行split,每个输入分片(input split)针对一个map任务,输入分片(InputSplit)存储的并非数据本身,而是一个分片长度和一个记录数据位置的数组。输入分片(InputSplit)通常和HDFS的block(块)关系密切。加入我们设定HDFS的块的大小是128M,我们运行的大文件是128*10MB,MapReduce会分为10个MapTask,每个MapTask都尽可能运行在block(块)所在的DataNode上,体现了移动计算不移动数据的思想

2.map阶段

map阶段就是执行自己编写的Mapper类汇中的map函数,Map过程开始处理,MapTask会接收输入分片,通过不断的调用map方法对数据进行处理,处理完毕后,转换为新的<key,value>键值对输出.

3.Shuffle阶段

shuffle阶段主要负责将map端生成的数据传递给reduce端,因此shuffle分别在map端的过程和在reduce端的执行过程。

具体执行过程如下:

(1)MapTask收集map()方法的输出<key,value>对,放到内存缓冲区(环形环形缓冲区),其中环形缓冲区的大小默认是100MB;

(2)环形缓冲区到达一定阈值(环形缓冲区大小的80%)时,会将缓冲区中的数据溢出本地磁盘文件,这个过程会溢出多个文件

(3)多个溢写文件会被合并成大的溢写文件。

(4)在溢写过程中及合并的过程中,都要调用Partitioner进行分区和针对key进行归并排序sort。

(5)合成大文件后,map端shuffle的过程也就结束了,后面进入reduce端shuffle的过程。

(6)在Reduce端,shuffle主要分为复制map输出(copy),排序合并(merge sort)两个阶段

​ Reduce任务通过HTTP向各个Map任务拖取它所需要的数据。

​ Copy过来的数据会先放入内存缓冲区中,如果内存缓冲区中能放得下这次数据的话就把数据直接写到内存中,即内存到内存merge。Reduce要向每个Map拖取数据,在内存中每个Map对应一块数据,当内存缓存区中存储Map数据占用空间达到一定程度的时候,开始启动内存中merge,把内存中的数据merge输出到磁盘上一个文件中,即内存到磁盘merge

当属于该reducer的map端输出全部拷贝完成,则会在reducer上生成多个文件(如果拖取的所有map数据总量没有超过内存缓冲区,则数据就只存在于内存中),这时开始执行合并操作,即磁盘到磁盘merge

4.Reduce阶段

reduce从合并的文件中取出一个一个的键值对group,调用用户自定义的reduce方法(),生成最终的输出文件

5.注意

shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数就越少,执行速度就越快。

缓冲区的大小可以通过参数调整,参数:io.sort.mb 默认100M。

三.各个阶段的工作机制

InputFormat是个接口,FileInputFormat和DBInputFormat是InputFormat的实现类

  • FileInputFormat—文件类型—抽象类

  • DBInputFormat—数据库类型—具体实现类

FileInputFormat是一个抽象类,有很多实现类,默认的是TextInputFormat

1.InputFormat数据输入

InputFormat 的主要功能:是确定每一个 map 任务需要读取哪些数据以及

何读取数据的问题

  • 读哪些数据:每个map读取哪些数据有InputSplit(数据切片)决定;
  • 如何读取数据:由RecordReader来决定

inputformat就有获取inputsplit和RecordReader的方法

inputformat接口源码

package org.apache.hadoop.mapred;

import java.io.IOException;
import org.apache.hadoop.classification.InterfaceAudience.Public;
import org.apache.hadoop.classification.InterfaceStability.Stable;

@Public
@Stable
public interface InputFormat<K, V> {
   
    InputSplit[] getSplits(JobConf var1, int var2) throws IOException;

    RecordReader<K, V> getRecordReader(InputSplit var1, JobConf var2, Reporter var3) throws IOException;
}

1.1FileInputFormat抽象类

在这里插入图片描述

1.1.1FileInputFormat源码解析

实现步骤:

(1)找到输入数据存储的目录

(2)开始遍历处理(规划切片)目录下的每一个文件

(3)遍历第一个文件hello.txt

​ a).获取文件大小fs.sizeOf(hello.txt)

​ b).计算切片大小computeSli

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MapReduce是一种用于处理大规模数据集的分布式计算编程模型。它的工作流程可以分为以下几个步骤: 1. 输入数据分割:首先,输入数据被分割为多个小的数据块。每个数据块的大小通常是以文件的大小来决定的,以便可以被分配给不同的计算节点进行并行处理。 2. 映射(map)阶段:每个计算节点将之前分割的数据块作为输入,并根据特定的映射函数对其进行处理。映射函数将输入数据转化为一系列的键值对(key-value pairs)。 3. 中间数据排序和分组:在映射阶段之后,所有计算节点上产生的键值对将会根据键(key)进行排序和分组。这个过程可以减少网络传输的数据量,并将具有相同键的值(value)聚合在一起。 4. 归约(reduce)阶段:在归约阶段中,每个计算节点会将之前分组得到的键值对集合作为输入,并进行进一步的处理。归约函数根据具体业务需求对相同键的值进行计算合并。 5. 最终结果输出:在归约阶段完成之后,最终的处理结果会被写入输出文件中。通常情况下,输出文件由多个分区组成,每个分区对应一个键值对。 整个MapReduce过程具有容错性和可伸缩性。如果某个计算节点在处理过程中发生故障,系统会自动将其任务重新分配给其他健康的计算节点。同时,用户可以根据数据量的增加或减少来调整计算节点的数量,以实现更高的处理性能。 总之,MapReduce是一种能够高效处理大规模数据集的分布式计算方法。它通过分割输入数据、映射、排序和分组、归约等步骤,使得计算任务可以并行处理,并最终得到处理结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值