04 MapReduce即是一个编程模型又是一个计算框架

书接上文:03 HDFS大规模服务计算

讲完了存储,那么我们到了分布式计算的环节~ Hadoop的Mapreduce

Hadoop包含以下模块:

  • Hadoop Common:支持其他Hadoop模块的通用工具。(辅助工具)
  • Hadoop 分布式文件系统 (HDFS™):一种分布式文件系统,提供对应用程序数据的高吞吐量访问。(数据存储)
  • Hadoop YARN:用于作业调度和集群资源管理的框架。(资源调度)
  • Hadoop MapReduce:一个基于YARN的系统,用于并行处理大型数据集。(计算)

前面说过,移动计算比移动数据更划算,Hadoop使用MapReduce编程产生了怎样的化学反应。首先开发人员必须基于MapReduce编程模型进行编程开发,然后将程序通过MapReduce分发到Hadoop中运行。也就是Map和Reduce的两个过程,map的输入是一对键值对,经过map计算后输出一对key和value的值,然后将相同的key合并,输入reduce,经过计算输出0个或者多个键值对。

HDFS将数据分发到了多个节点上,那么Map过程,相当于各个节点上的独立计算,举这样一个例子:统计所有节点上存储数据的“hello”出现的个数。

  1. 那么程序员实现map部分的代码,统计单个节点上“hellow”个数,并输出一个键值对, n1是这个节点上hello统计个数。
  2. 如果一共有k个节点,那么MapReduce会把程序分发到k个节点上,并且把所有的结果以的形式输出入给Reduce函数
  3. 那么程序员还需在reduce函数中实现sum(n1~nk)的逻辑。这样就得到了统计所有节点上数据的结果

由这样的一个简单的例子,我们可以得出这样的一个结论,MapReduce即是编程模型,又是一个计算框架。

MapReduce是如何完成上述的过程的:从上述的例子可以看到,MapReduce在框架上的处理起码要有这样两个步骤:

        1、给数据块分配一个Map计算任务:也就是发送代码到数据块所在服务器,然后启动程序,启动之后又需要知道自己要计算的数据位置在哪里(前文提到,数据是多分,每个任务根据地址偏移找到要计算的数据位置)也就是BlockID。

        2、reduce数据合并与链接:把每个服务器上的计算结果聚合在一起发送给Reduce任务。

也就是说Hadoop需要有这样的几个关键进程,或者说是关键动作:

        1 指定Map和Reduce类,就像注册一个回调函数,并且指定输入路径输出路径等,并且提交作业给Hadoop集群(这个集群进程也就是JobTracker进程),这是由用户启动的MapReduce程序进程,比如我们上述提及的统计hellow单词的个数。

        2 上述作业接收的进程(JobTracker进程),这个进程要根据任务输入的数据量,命令TaskTracker进程启动相应数量的Map和Reduce进程任务,并管理整个作业生命周期的任务调度和监控。这个进程在Hadoop集群中全局唯一。

        3 TaskTracker进程,这个进程负责启动和管理Map进程以及Reduce进程,因为这个数据块有对应的Map函数 ,TaskTracker进程通常和HDFS的DataNode进程启动在同一个服务器,也就是说,Hadoop集群中绝大多数服务器同时运行DataNode进程和TaskTracker进程。

        可以出JobTracker和TaskTracker是主从关系,前者负责调度,后者负责执行任务,可以看出,实际上对外提供服务的只有JobTracker一台服务器,但是执行任务的TaskTracker可以成百上千。前文说过HDFS的主服务器是NameNode,从服务器是DataNode,同样Yarn,Spark也都是这种架构,一主多从的服务器构架也是大多数大数据系统的架构方案。

        04 MapReduce即是一个编程模型又是一个计算框架_第1张图片

 

 上图描述了一次任务过程。

  1. JobClient将用户作业JAR包存储在HDFS中,这些JAR包会分发给Hadoop集群中的服务器执行MapReduce计算。(图里没画)
  2. 应用程序提交job作业给JobTracker。
  3. JobTracker根据作业调度策略创建JobInProcess树,每个左右都回有一个自己的JobInProcess树
  4. JobInProcess根据输入数据分片数目和设置的Reduce数目创建对应数量的TaskInProcess
  5. TaskTracker进程和JobTracker进程进行定时通信
  6. 如果TaskTracker有控线的计算资源,jobTracker就会给他分配任务,分配任务的时候会根据TaskTracker的服务器名字匹配在同一台机器上的数据块计算任务给他,时启动的计算任务正好处理本机上的数据,以实现一开始提到的移动计算比移动数据更划算。
  7. TaskTracker收到任务后根据任务类型和任务参数,启动对应Map或者Reduce进程。
  8. 启动后检查本地是否有要执行任务的JAR包文件,如果没有,就去HDFS上下载。
  9. 如果是map进程要从HDFS读取数据,如果是Reduce进程,结果写出到HDFS上。

MapReduce数据合并机制:

        在map输出与reduce之间,存在一个shuffle操作,几乎所有的大数据场景都需要处理数据关联的问题,对于像数据库的join操作这种比较复杂的,需要对两种类型的数据根据key进行链接,这个操作就是shuffle。

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

你可能感兴趣的:(大数据,mapreduce,大数据,hadoop)