MapReduce如何让数据完成一次旅行

我们应该已经知道MapReduce不仅仅是一个分布式计算的框架,更加也是一种算法,常规的算法中,我们也可以使用这种模型去进行运算,也就是Mapper - Reducer 过程 ,但是,MapReduce还有很多看不见的过程,也是让我们值得去探究一下的,比如说shuffle,就是相当关键的一个环节,我们都知道这是混洗,但是混洗的具体过程是什么,又是问题,所以这篇文章将会主要讲述一下MapReduce的过程。

首先引入以下两个问题

  • 如何给数据块去分配Map计算任务,我们已经知道了,每个数据块在HDFS上对应一个BlockID,那么Map怎么去找到这些数据块?

  • 我们的环境是分布式的,处在不同服务器的Map后的数据,要如何聚合发送给Reduce?

我们先看看下图,MapReduce的整体流程图

在这里插入图片描述

MapReduce作业启动和运行机制

以Hadoop 1 举例,MapReduce运行过程涉及三类关键进程。

  1. 大数据应用进程

这类进程是启动MapReduce的主入口。指定Map类和Reduce类的位置,输入输出数据的路径,然后提交给Hadoop集群的JobTracker进程。

  1. JobTracker进程

这类进程要根据要处理的输入数据量,命令下面提到的TaskTracker进程启动对应数量的map和reduce进程,并且管理map和reduce的任务调度与监控,管理整个生命周期。JobTracker进程在整个Hadoop集群中全局唯一,与NameNode启动在相同节点

  1. TaskTracker进程

管理map和reduce进程,与DataNode启动在相同的节点,并且与DataNode同时启动,并且和JobTracker的关系,形如DataNode与NameNode。

而后面会说到的Yarn与Spark也是相同的架构模式
架构模式:可重复使用的架构方案叫做架构模式。
分布式中常见的一主多从就是一个经典的架构模式。

然后接下来进一步的来了解一下MapReduce

在这里插入图片描述
然后来解释一下整个计算过程的流程:

  1. 应用进程JobClient将用户的作业包存储在HDFS中,将来会分发给Hadoop内部的集群进行MapReduce计算。

  2. 应用程序提交job作业给JobTracker。

  3. JobTracker根据作业调度策略创建JobInProcess树,每一个作业都会有自己的一个JobInProcess树。

  4. JobInProcess树根据数据分片数目(Block个数)和设置的Reduce数目创建响应数量的TaskInProcess。

  5. TaskTracker与JobTracker保持通信(心跳)。

  6. 如果这时候TaskTracker有空闲的CPU资源,JobTracker就会给他分配任务。分配任务的时候根据TaskTracker的服务器名字匹配在同一台机器上的数据块计算任务给它,使启动的计算任务正好处理本机的数据。

  7. TaskTracker收到任务后开始干活,根据任务类型(Map/Reduce)和任务参数(数据块路径,文件路径,程序路径)要处理的数据在文件中的偏移量、数据块多个备份的DataNode等等,然后正式启动MapReduce进程

  8. 进程启动之后,开始寻找jar包文件,先从linux本地找,然后再从HDFS找。

  9. 如果是Map进程,从HDFS读取数据,如果是Reduce进程,将结果数据写出到HDFS。

虽然步骤多,但是实际上自己要写的仅仅是Map和Reduce其余的,都被内部安排了。

MapReduce数据合并和连接

在MapReduce的Map输出然后输入到Reduce阶段中,有一个专门的操作叫做shuffle,那么shuffle到底是什么呢,可以看如下图:

在这里插入图片描述

每一个Map任务的计算结果都会被记录到本地文件系统,等Map任务快要结束的时候,MapReduce就会自动启动shuffle过程,在Map任务进程调用一个Partitioner接口,对Map产生的每个<key,Value>进行Reduce分区选择 ,然后通过基本的HTTP协议发送给对应的Reduce进程。这样不管Map位于哪一个节点,也一定能顺利聚合。

map输出的<Key, Value>shuffle到哪个Reduce进程是这里的关键,它是由Partitioner来实 现,MapReduce框架默认的Partitioner用Key的哈希值对Reduce任务数量取模,相同的Key一 定会落在相同的Reduce任务ID上。从实现上来看的话,这样的Partitioner代码只需要一行。

public int getPartition(K2 key, V2 value, int numReduceTasks) {
      return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;   
} 

总结一下:分布式计算需要将不同服务器上相关的数据合并到一起进行下一步计算,这就是shuffle

shuffle是分布式计算中非常神奇的存在,不管是MapReduce还是Spark,只要是大数据开发,都会有这个阶段,让数据关联起来,数据的内在联系和价值才会体现出来,同时shuffle也是MapReduce中最消耗资源与性能的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值