大数据—Hadoop之MapReduce机制和工作流程

 MapReduce学习总结

     1.Mapreduce是什么?

        Hadoop  Mapreduce是一个软件框架,基于这个框架能够容易的编写应用程序,这些应用程序能够运行在上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行的处理上TB级别的海量数据集。Mapreduce具有:①软件框架②并行处理③可靠且容错④大规模集群⑤海量数据。

    2.MapReduce工作机制

      可以将MapReduce的工作流程概括为4个独立的实体:①客户端,用来提交MapReduce的作业。编写MapReduce程序,配置作业,提交作业,程序员完成的工作。②JobTracker,用来协调作业的运行。与TaskTracker通信,协调整个作业的执行③TaskTracker,用来处理作业划分后的任务。保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个④HDFS,用来在其他实体间共享作业文件。保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面。

     MapReduce运行流程自我总结:首先客户端要编写好MapReduce程序,配置好MapReduce的作业也就是job,即诶下来就是提交job了,提交job是提交到JobTracker上,这时候JobTracker就会构建这个job,具体就是分配一个新的job任务的ID值。接下来它就会做检查操作,这个检查就是确定输出目录是否存在,如果存在那么job就不能正常运行下去,JobTracker会抛出错误给客户端,接下来还要检查输入目录是否存在,如果不存在同样抛出错误,如果存在JobTracker会根据输入计算输入分片,如果分片计算不出来也会抛出错误。这些都做好后JobTracker就会配置Job需要的资源了。分配号资源后,JobTracker就会初始化作业,初始化主要做的是将Job放入一个内部的队列,让配置好的作业调度器能调度到这个作业,作业调度器会初始化这个Job,即创建一个正在运行的Job对象,以便JobTracker跟踪job的状态和进程。初始化完毕后,作业调度器就会获取输入分片信息,每个分片创建一个map任务。接下来开始任务分配,这个时候TaskTracker会运行一个简单的训话机制定期发送心跳给JobTracker,心跳间隔是5秒,程序员可以配置这个时间,心跳就是JobTracker和TaskTracker沟通的桥梁,通过心跳,JobTracker可以监控TaskTracker是否存活,也可以获取TaskTracker处理的状态和问题,同时TaskTracker也可以通过心跳里的返回值获取JobTracker给它的操作命令。任务分配完成后开始执行任务。在任务执行时候JobTracker可以通过心跳机制监控TaskTracker的状态和进度。当JobTracker获得了最后一个完成指定任务的TaskeTracker操作成功的通知时候,JobTracker会吧整个job状态设置为成功,然后当客户端查询job运行状态时(异步操作),客户端会查到job完成的通知。如果job中途失败,MapReduce也会有相应的机制处理,一般而言如果不是程序员程序本身有bug,Mapreduce错误处理机制都能保证提交的job能正常完成。

  3.MapReduce框架执行过程(时间顺序)

    在Hadoop中,一个MapReduce作业会把输入的数据集切分为若干独立的数据块,有Map任务以完全并行的方式处理。框架会对Map的输出先进行排序,然后把结果输入给Reduce任务。作业的输入和输出都会被存储在文件系统中,整个框架负责任务的调度和监控,以及重新执行已关闭的任务。MapReduce框架和分布式文件系统是运行在一组相同的节点,计算节点和存储节点都是在一起的。

   MapReduce按照时间顺序作业流程可分为:输入分片(input split)—>map阶段—>conbiner阶段—>Shuffle阶段—>Reduce阶段。

    ①输入分片。在进行map计算之前,MapReduce会根据输入文件计算输入分片,每个输入分片针对一个Map任务。输入分片存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组,输入分片往往和hdfs的block关系密切。(我们设定hdfs的块的大小是64mb,如果我们输入有三个文件,大小分别为3mb,65mb和127mb,那么MapReduce会把3mb文件分为一个输入分片,65mb则是两个输入分片,而127mb也是两个输入分片。即如果我们在map计算前做输入分片调整,例如合并小文件,那么就会有5个map任务将执行,而且每个map执行的数据大小不均,这个也是MapReduce优化计算的一个关键点。)

    ②Map阶段。对输入的(key,value)进行处理,即map(k1,v1)->list(k2,v2),使用Job.setMapperClass进行设置。

    ③Combiner阶段。Combiner是一个本地化的reduce操作,它是map运算的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作,例如我们对文件里的单词频率做统计,map计算时候如果碰到一个hadoop的单词就会记录为1,但是这篇文章里hadoop可能会出现n多次,那么map输出文件冗余就会很多,因此在reduce计算前对相同的key做一个合并操作,那么文件会变小,这样就提高了宽带的传输效率,毕竟hadoop计算力宽带资源往往是计算的瓶颈也是最为宝贵的资源,但是combiner操作是有风险的,使用它的原则是combiner的输入不会影响到reduce计算的最终输入,例如:如果计算只是求总数,最大值,最小值可以使用combiner,但是做平均值计算使用combiner的话,最终的reduce计算结果就会出错。

   ④Shuffle阶段。Shuffle操作一开始是map阶段做输出操作。一般mapreduce计算的都是海量数据,ap在做输出时候会在内存里开启一个环形内存缓冲区,这个缓冲区专门用来输出的,默认大小是100mb,并且在配置文件里为这个缓冲区设定了一个阀值,默认是0.80(这个大小和阀值都是可以在配置文件里进行配置的),同时map还会为输出操作启动一个守护线程,如果缓冲区的内存达到了阀值的80%时候,这个守护线程就会把内容写到磁盘上,这个过程叫spill,另外的20%内存可以继续写入要写进磁盘的数据,写入磁盘和写入内存操作是互不干扰的,如果缓存区被撑满了,那么map就会阻塞写入内存的操作,让写入磁盘操作完成后再继续执行写入内存操作,前面我讲到写入磁盘前会有个排序操作,这个是在写入磁盘操作时候进行,不是在写入内存时候进行的 。

   ⑤Reduce阶段。和Map函数一样是程序员编写的,最终结果存储在hdfs上。

大数据—Hadoop之MapReduce机制和工作流程

大数据—Hadoop之MapReduce机制和工作流程

大数据—Hadoop之MapReduce机制和工作流程

大数据—Hadoop之MapReduce机制和工作流程

 4.jobtracker的单点故障:jobtracker和hdfs的namenode一样也存在单点故障,单点故障一直是hadoop被人诟病的大问题,为什么hadoop的做的文件系统和mapreduce计算框架都是高容错的,但是最重要的管理节点的故障机制却如此不好?老师的观点是:主要是namenode和jobtracker在实际运行中都是在内存操作,而做到内存的容错就比较复杂了,只有当内存数据被持久化后容错才好做,namenode和jobtracker都可以备份自己持久化的文件,但是这个持久化都会有延迟,因此真的出故障,仍然不能整体恢复,另外hadoop框架里包含zookeeper框架,zookeeper可以结合jobtracker,用几台机器同时部署jobtracker,保证一台出故障,有一台马上能补充上,不过这种方式也没法恢复正在跑的mapreduce任务。

  总结一下,就是单节点故障会导致运行,当jobtracker发生故障时,整个运行任务都会停止,如果多个机子部署JobTracker,虽然能保证进程能安稳运行,但仍不能保证故障过程中的数据恢复完整。