Hadoop中Map任务的执行框架

2019-03-28 14:14|来源: 网络

在这博文章中(http://www.linuxidc.com/Linux/2012-01/50854.htm),我重点讲述了Task被TaskTracker调度执行的原理及过程,但是在详细的介绍执行Task的过程细节之前,我想先来认真的讨论一下Map Task和Reduce Task的执行框架。当然本文主要集中在Map Task上,至于Reduce Task的相关内容,我会在下一篇博文中谈到。在这篇文章中,我将尽量给出一个最抽象的Map模型

Hadoop的MapRduce中,Map任务最重是交给Map任务执行器org.apache.hadoop.mapreduce.Mapper来执行的,在底层必定会采用JDK的泛型编程的。还是来了解一下与Map任务执行器相关的Mapper类吧。

对于上面与Map任务执行框架相关的类,我想我不得不详细的解释一下。任何Map任务在Hadoop中都会被一个MapTask对象所详细描述,MapTask会最终调用Mapper的run方法来执行它对应的Map任务,当然Mapper要执行Map任务,就必须要有相关的所有输入输出信息,而这些信息都包含在了Map任务对应的Context中了,也就是说Mapper从Context中获得一系列的输入数据记录,然后又将这些处理后的记录写入Context中,同时输入、输出的数据格式都是交由用户来实现/设置的。那么,Context的输入数据有来自哪个地方,又将处理后的数据写往何处呢?其实,Context是通过RecordReader来获取输入数据,通过RecordWriter保存被Mapper处理后的数据。至此,Map任务的真个执行框架我们可以这样来抽象:

关于上面我抽象出来的这个Map任务执行框架,还需要补充的是,在Map任务对应的上下文执行环境Context中有个任务报告器TaskReporter,它被用来不断的向这个Map任务的TaskTracker报告任务的执行进度(这个精度只是一个估计值,不一定很准确)。另外,有人可能会问这个Map任务的输入文件和结果输出文件的有关信息Context是如何获悉的?其实,Map任务的输入文件文件保存在InputSplit中,这个InputSplit保存了文件的路径、范围、位置;Map任务的输出文件信息是在执行过程中动态生成的,因为Map任务的结果输出实际上就是Reduce任务的输入,它相当于只是全局作业中的一个中间过程,所以这个Map任务的输出结果的保存对于用户来说是透明的,而用户往往也只关心Reduce任务的最后汇总结果。

下面再来看看这个框架具体的执行步骤:

本文所介绍的只是抽象的Map任务执行框架,至于MapReduce内部是如何具体实现的,我还会在以后进行详细的阐述。(上文都是本人的一些个人见解,若有不当或错误之处尽请指出,以便帮助我学习进步,谢谢!)

相关问答

更多
  • 在各个slave(datanode)上面有会有Map和Reduce执行代码。 在Job提交时,会打包该job的配置文件类文件,jar文件等,拷 贝到各个datanode上面,做本地执行的。
  • 换个角度讲, 当C#在微软平台上成为主流开发语言的时候, python已经渐渐的成为了linux应用程序的主流开发语言之一了. 原因很简单, perl在淡出, ruby未发力, shell不够用, php不合适, java不解释. 记得Redhat 7的字符界面安装程序就是python写的, 那几乎是我第一次听说python的年代了.
  • 找到离存数据最近的一台机器运行和这个数据相关的map任务,reduce是按照你整理出的key有多少个来决定的。一个机器很难说,处理的快的处理多一点,保持所有机器使用平衡。 上面你都自己写了20个map,和文件大小个数有关,和数据条数无关。 要看你选择的输入格式是什么,默认是行偏移量,然后由你编写map函数,指定key和value是什么。相同的key整合起来传给reduce,由reduce进行下一步处理,最后输出到指定的地方。
  • 首先hadoop框架要求程序员将函数分成两部分,即map和reduce函数。 map阶段:就是将输入通过map函数处理得出中间结果并通过hadoop框架分配到不同的reduce。 reduce阶段:就是将中间结果通过reduce函数处理得到最后的结果。 以wordcount为例,在map阶段,map函数在每个单词后面加上一个1;在reduce阶段,reduce函数将相同单词后面的1都加起来。其中hadoop框架实现过程中的排序,分配等,当然这些也可以通过自定义的函数来控制。
  • 添加TableMapReduceUtil后,它的工作原理 Job job = new Job(config, "Import from file "); job.setJarByClass(LogRun.class); //set map class job.setMapperClass(LogMapper.class); TableMapReduceUtil.initTableReducerJob(table, null, job); job.setNum ...
  • 我认为你没有使用reducer,mapper输出是最终输出 如果你引入减速器,则会发生改组和排序,你会获得所需的输出。 请参考以下问题:减速机的改组和分拣阶段的目的是什么 示例Reducer实现: public class Reduce extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOExceptio ...
  • 可能的原因:您没有从映射器输出任何东西,以便减速器首先运行。 尝试使用outputCollector.collect(key, value); 从映射器中为reducers实际运行写一些东西。 Probable reason: you are not outputting anything from the mapper for the reducers to run at the first place. Try using outputCollector.collect(key, value); fro ...
  • 输入文件:: Dravid Banglore Sachin Mumbai Dhoni Ranchi Dravid Jaipur Dhoni Chennai Sehwag德里Gambhir德里Gambhir加尔各答减速机输出:: Dravid Banglore,Jaipur Dhoni Ranchi,Chennai Gambhir德里,加尔各答Sachin Mumbai Sehwag德里 这可以使用Map Reduce程序来实现。 Mapper类:玩家名称为关键,地名为值。 Reducer类:当我们遍历键(玩 ...
  • hadoop-env.sh在hadoop-daemon.sh中调用(start-all.sh - > start-dfs.sh - > hadoop-daemon.sh)。 以下是摘录。 if [ -f "${HADOOP_CONF_DIR}/hadoop-env.sh" ]; then . "${HADOOP_CONF_DIR}/hadoop-env.sh" fi 您必须在hadoop-env.sh中设置您的JAVA_HOME路径以及其他所需的环境变量。 所以它必须在你所有的恶魔开始之前被调用/执行。 ...
  • a)Job Tracker,Task Tracker是软件还是硬件? 两者都是软件。 即在集群的节点上运行的服务。 b)正如其中一个例子中给出的那样,关于map reduce用于查找某些(例如3个)文件中所有单词的出现,那么你在哪里给出查询,即在map reduce程序中“查找单词的出现次数”? 地图如何知道要做什么 除非您使用配置单元,否则没有查询语言。 你基本上在Mapper和Reducer类中实现你的逻辑。 a) Whether the Job Tracker,Task Tracker comes a ...