分布式——MapReduce

1.总述

我们知道分布式的主要作用是拆分任务,分发给集群中的pc来并行处理。对于这个功能而言,于是引起了如下几个问题或者说分布式系统需要实现的几个功能点:

  1. 如何分发任务——那必然设计到多机通讯的RPC功能,当然有很多成熟的RPC框架可以使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle(开源)等。
  2. 如何处理高并发场景下的并行计算——那必然设计到并发控制、负载均衡、多线程等
  3. 如何面临子任务失败的问题——那必然涉及到复制容错的实现
  4. 如何处理大批量数据——大数据下,内存肯定存不下,必然涉及到存储功能、数据持久化功能的实现
  5. 如何处理多服务器场景下,由于某任务需要多系统配合,必然涉及到多阶段任务提交,那如果某个系统在任务执行完成但是还没响应之前,该系统服务器就宕机了,这样就带来了数据的不一致问题——于是需要解决一致性问题。
    更详细的解释一下一致性问题:
    在这里插入图片描述

2.MapReduce

对于上面提到的功能点,有很多不同的分布式系统来解决这些问题,其中MapReduce就是一个成熟的分布式架构系统。下面从这篇经典的MapReduce论文中来简单理解一下:
在这里插入图片描述
当用户程序通过调用MapReduce从而提交程序到分布式集群中处理任务计算时,下面是具体的执行步骤:

  1. 首先是MapReduce会对要处理的数据进行分割,按照用户指定的大小(HDFS中默认是64MB)进行分割,每一个piece对应一个map。

  2. 然后copy用户处理程序(包括了MapReduce本身,用户处理程序本身就是通过调用MapReduce执行的)到集群的PC中。

  3. 在众多copy用户处理程序的PC中有一个特殊的PC便是master(完成MapReduce的master程序功能),负责给其它闲置PC(Worker)分配任务(map或者reduce),所以得涉及到RPC,以及负责展示各个任务程序的处理进度等。

    由于master要及时了解到所有的worker的状态信息,因此需要在其内部维持一个数据机构来保存所有还活着的worker节点。worker节点通过不断的心跳汇报(HeartBeat)来和Master通信,Master把收到心跳汇报的worker节点看做是目前存活的,否则就说明worker节点挂掉了。除了维持存活性以外,Master节点通常还会把需要执行的命令通过心跳返回给worker节点,worker节点接收到后执行Master发来的命令,完成一次交互。

  4. 然后对于每个执行map的worker,可能会不断接受到任务处理通知,从而进行数据处理(如partition,按照key mod NReduce进行分组,每一个Reduce要收集所有map中同一partition的键值对数据),这样将处理好的数据不断放到buffer中,当buffer过大则会发生溢写操作(一般在溢写前都会进行sort、combine操作),写入到中间结果文件,然后返回中间结果文件的位置给master。

  5. 对于每个执行reduce任务的worker,上面说过会收集所有map的中间结果文件,然后进行sort操作(虽然在map溢写时已经做过排序操作,但是由于收集到的是多个不同map的数据,虽然单个map有序,但多个map所形成的中间结果集合则是无序的了),当数据量超过内存,也会发生溢写操作(当然可能也会涉及到merge、combine等操作)。

    其实上面的map和reduce阶段的partition、sort、combine、merge等都属于shuffle的范畴。

  6. 当所有的map任务和reduce任务完成后,MapReduce就会返回用户代码,按照用户程序指定的方式执行下一轮操作。

发布了69 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/JustKian/article/details/100775872