您的位置:首页 > 运维架构 > 网站架构

深入剖析MapReduce架构及原理(二)

2018-04-02 05:27 246 查看

深入剖析MapReduce架构及原理

MapReduce 的基本架构

MapReduce的架构

和HDFS一样,MapReduce也是采用Master/Slave的架构,其架构图如下所示。
 


MapReduce包含四个组成部分,分别为Client、JobTracker、TaskTracker和Task,下面我
们详细介绍这四个组成部分。

1)Client 客户端

每一个 Job 都会在用户端通过 Client 类将应用程序以及配置参数 Configuration 打包成
JAR 文件存储在 HDFS,并把路径提交到 JobTracker 的 master 服务,然后由 master 创建每一个 Task(即 MapTask 和 ReduceTask)将它们分发到各个 TaskTracker 服务中去执
行。

2)JobTracker

JobTracke负责资源监控和作业调度。JobTracker 监控所有TaskTracker 与job的健康状况,
一旦发现失败,就将相应的任务转移到其他节点;同时,JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop 中,任务调度器是一个可插拔的模块,用户可以根据自己的需要设计相应的调度器。<
4000
/span>

3)TaskTracker

TaskTracker 会周期性地通过Heartbeat 将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀
死任务等)。TaskTracker 使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop 调度器的作用就是将各个TaskTracker 上的空闲slot 分配给Task 使用。slot 分为Map slot 和Reduce slot 两种,分别供Map Task 和Reduce Task 使用。TaskTracker 通过slot 数目(可配置参数)
限定Task 的并发度。

4)Task

Task 分为Map Task 和Reduce Task 两种,均由TaskTracker 启动。HDFS 以固定大小的 block 为基本单位存储数据,而对于MapReduce 而言,其处理单位是split。split 是一个逻
辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。但需要注意的是,split 的多少决定了Map Task 的数目,因为每个split 只会交给一个Map Task 处理。Split 和 Block的关系如下图所示:
 


Map Task 执行过程如下图所示:由该图可知,Map Task 先将对应的split 迭代解析成一个个key/value 对,依次调用用户自定义的map() 函数进行处理,最终将临时结果存放到本地
磁盘上, 其中临时数据被分成若干个partition,每个partition 将被一个Reduce Task 处理。
 


Reduce Task 执行过程下图所示。该过程分为三个阶段:
①从远程节点上读取Map Task 中间结果(称为“Shuffle 阶段”);
②按照key 对key/value 对进行排序(称为“Sort 阶段”);
③依次读取< key, value list>,调用用户自定义的reduce() 函数处理,并将最终结果存到HDFS 上(称为“Reduce 阶段”)。
 


MapReduce 数据本地性

在介绍数据本地性之前,我们首先介绍网络拓扑的概念。在一个 Hadoop 集群里面,通常我们把这些机器按照机架来组织,比如说每个机架一般有16-64个节点。每个机架通过 Switch 交换机来通信,不同的机架又通过总的Switch交换机来交互。其架构图如下所示。
 


在上图的架构中,我们标注了A、B、C、D四个节点,其中A、B、C三个节点存储了block1数据块。我们假设节点A要读取block1数据块,那么它的最佳选择就是读取它本身存储的block1,此时读取的速度最快、效率最高。如果A本身的block1数据块丢失或者损坏,它就会选择读取同一个Switch机架下的B节点上的block1,这是因为在同一个机架下面读取数据相对较快,所以不会选择跨机架读取C节点上面的block1,因为跨机架读取数据的效率最差。除非A、B中的block1都丢失或者损坏,才会选择跨机架读取C节点上面的block1。

数据本地性(data locality)

那到底什么是数据本地性呢?如果一个任务运行在它将处理的数据所在的节点,我们就称该任务具有“数据本地性”。数据的本地性可避免跨节点或者机架进行数据传输,提高运行效率。

数据本地性分为三个类别:

1、同节点(node-local)。
2、同机架(rack-local)。
3、跨机架(off-switch)。
为了深入理解数据本地性的三个类别,我们下面举个示例,如下图所示。



从上图可以看出一共有四个机架:R1、R2、R3和R4,每个机架上有三个节点,每个节点上
面存储有不同的数据块。比如,R1机架下有三个节点:H1、H2和H3,H1节点上有b1和b8数据块,H2节点上有b1和b2数据块,H3节点上有b2和b3数据块。从上图可以看出,每个数据块有3个备份,按照 HDFS 的备份机制将这3个数据块存储到不同的节点上。下面我们来看一下数据本地性的三种类别。
1、我们假设Task1需要处理b1,H1节点正好有空闲资源得到Task1,H1节点存储有b1,这时Task1在本节点上直接读取b1,效率最高。这种情况下数据本地性称之为node-local。
2、我们假设Task2需要处理b2,H4节点正好有空闲资源得到Task2,b2不在H4节点上,那么Task2会找到存储有b2且距离最近的H5节点,H4和H5处于同一个机架,这时Task2会读取同机架节点上的b2。这种情况下数据本地性称之为rack-local。
3、我们假设Task3需要处理b3,H7节点正好有空闲资源得到Task3,b3并不在H7节点上,也不在H7同机架的节点上,而是在R1和R2机架下面的节点上,这时Task3就需要跨机架读取b3,效率非常低下。这种情况下数据本地性称之为off-switch。

MapReduce 常见应用场景

MapReduce场景的应用场景如下所示:

1、数据统计,比如网站的pv、uv
2、搜索引擎建立索引
3、海量数据查找
4、复杂数据分析算法实现
1)推荐算法
2)分类算法
3)聚类算法
4)图算法

MapReduce 框架的容错性

MapReduce 最大的特点之一就是有很好的容错性,即使你的节点挂掉了1个、2个、3个,都是没有问题的,它都可以照常来运行,把你的作业或者应用程序运行完成。不会出现某个节点挂了,你的作业就运行失败这种情况。那么 MapReduce 到底是通过什么样的机制,使它具有这么好的容错性呢?下面我们依次来介绍一下。

1、JobTracker

很不幸,JobTracker 存在单点故障,一旦出现故障,整个集群就不可用。这个是1.0里面出现的问题,在2.0里面这个问题已经得到了解决。不过大家放心,即使在1.0中,MapReduce也不会经常出现故障。它可能一年也就是出现几次故障,出现故障之后,你重启一下,再把作业重新提交就可以了,它不会像 HDFS 那样出现数据的丢失。因为 MapReduce 是一个计算框架,计算过程是可以重现的,即使某个服务挂掉了,你重启一下服务,然后把作业重新提交,也是不会影响你的业务的。

2、TaskTracker

TaskTracker 周期性的向 JobTracker 汇报心跳,如果一定的时间内没有汇报这个心跳, JobTracker 就认为该TaskTracker 挂掉了,它就会把上面所有任务调度到其它TaskTracker(节点)上运行。这样即使某个节点挂了,也不会影响整个集群的运行。

3、MapTask和ReduceTask

MapTask和ReduceTask 也可能运行挂掉。比如内存超出了或者磁盘挂掉了,这个任务也就
挂掉了。这个时候 TaskTracker 就会把每个MapTask和ReduceTask的运行状态回报给JobTracker,JobTracker 一旦发现某个Task挂掉了,它就会通过调度器把该Task调度到其
它节点上。这样的话,即使任务挂掉了,也不会影响应用程序的运行。

MapReduce 资源组织方式

MapReduce 计算框架并没有直接调用 CPU和内存等多维度资源,它把多维度资源抽象为“slot”,用 “slot” 来描述资源的数量。管理员可以在每个节点上单独配置slot个数。slot可以分为map slot和reduce slot。从一定程度上,slot可以看做“任务运行并行度”。如果某个节点配置了5个map slot,那么这个节点最多运行5个Map Task;如果某个节点配置了3
个reduce slot,那么该节点最多运行3个Reduce Task。下面我们分别介绍 Map slot和 Reduce slot。

1、Map slot

1)Map slot 可用于运行 Map Task 的资源,而且只能运行 Map Task。
2)每个 Map Task 通常使用一个map slot。而比如像容量调度器,它可以有比较大的MapTask。这样的MapTask使用内存比较多,那么它可能使用多个map slot。

2、Reduce slot

1)Reduce slot 可用于运行ReduceTask,而且只能运行ReduceTask。
2)每个ReduceTask通常使用一个reduce slot。而比如像容量调度器,它可以有比较大的
ReduceTask。这样的ReduceTask使用内存比较多,那么它可能使用多个reduce slot。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: