MapReduce作业提交源码分析

2019-03-28 13:25|来源: 网络

MapReduce作业提交源码分析

我们在编写MapReduce程序的时候,首先需要编写Map函数和Reduce函数。完成mapperreducer的编写后,进行Job的配置;Job配置完成后,调用Job.submit()方法完成作业的提交。那我们思考一下,Job最终如何完成作业(job)的提交呢?粗略想一下,Job必然需要通过某种方式连接到JobTracker,因为只有这样才能将job提交到JobTracker上进行调度执行。还需要考虑一下,我们自己编写的mapperreducer,即Jar文件如何传送到JobTracker上呢?其中有一种最简单也比较直观的方法,直接通过socket传输给JobTracker,由JobTracker再传输给TaskTracker(注意:MapReduce并没有采用这种方法)。第三个需要考虑的内容是,JobTracker如何将用户作业的配置转化成map taskreduce task。下面我们来分析一下MapReduce这些功能的实现。

首先在class Job内部通过JobClient完成作业的提交,最终由JobClient完成与JobTracker的交互功能。在JobClient的构造函数中,通过调用RPC完成与JobTracker连接的建立。

完成建立后,JobClient首先确定job相关文件的存放位置(我们上面提到mapreduce没有采用将jar即其他文件传输给JobTracker的方式,而是将这些文件保存到HDFS当中,并且可以根据用户的配置存放多份)。至于该存放目录的分配是通过调用RPC访问JobTracker的方法来进行分配的,下面看一下JobTracker的分配代码:

final Path stagingRootDir = new Path(conf.get(

"mapreduce.jobtracker.staging.root.dir",

"/tmp/Hadoop/mapred/staging"));

final FileSystem fs = stagingRootDir.getFileSystem(conf);

return fs.makeQualified(new Path(stagingRootDir, user + "/.staging")).toString();

注意上面代码所生成的stagingRootDir是所有job文件的存放目录,是一个根目录,并不单指当前job

完成job存放目录的分配后,JobClientJobTracker申请一个JobID(通过RPC,注意基本上JobClientJobTracker的所有通信都是通过RPC完成的,如果下文没有显示著名也应该属于这种情况)。

JobID jobId = jobSubmitClient.getNewJobId();

下面是JobTracker.getNewJobId的具体实现:

public synchronized JobID getNewJobId() throws IOException {

return new JobID(getTrackerIdentifier(), nextJobId++);

             }

获得JobID后,将该JobID与上面的stagingRootDir组合就构成了Job文件的具体存放地址的构建。进行这些相关工作后,JobClient将相关的文件存储到HDFS当中。

相关问答

更多
  • jquery 源码 分析[2022-08-08]

    看完之后对对象和原型的理解帮助会非常大。 但最好等用jquery比较熟悉之后再看源码,那么会对理解比较有好处,也会比较容易看懂。 最好从jquery核心处开始看,看懂$.fn.init以及基本方法之后再看别的$.extend的时候就比较容易了。
  • 关于内核的书不在多,而是要精,强烈推荐 《Linux内核设计与实现》,英文名Linux Kernel Development,机械工业出版社,¥35, 美国Robert Love著,陈莉君译。 此书是当今首屈一指的入门最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。对没怎么深入内核的人来说,这是强烈推荐的一本书。
  • 不好意思,我现在才看到消息, 我会尽快发到您的邮箱的。
  • 谁说入口就一定是WinMain?很多自定义入口,而且控制台程序默认入口为main,对于MFC的入口,实际上他也是从WinMain开始的,只是WinMain并不在程序中显示,你去查一下头文件就知道了,或者在头文件WinMain设置断点,实际上他还会断在WinMain上,另外好像还有一个AfxMain,我忘记了你自己看头文件
  • MapReduce作业提交源码分析 我们在编写MapReduce程序的时候,首先需要编写Map函数和Reduce函数。完成mapper和reducer的编写后,进行Job的配置;Job配置完成后,调用Job.submit()方法完成作业的提交。那我们思考一下,Job最终如何完成作业(job)的提交呢?粗略想一下,Job必然需要通过某种方式连接到JobTracker,因为只有这样才能将job提交到JobTracker上进行调度执行。还需要考虑一下,我们自己编写的mapper和reducer,即Jar文件如何传 ...
  • 我最终解决了这个问题。 我在我的类路径中找到了相互冲突的罐子,我清理过,从那时起我就没有问题了。 I eventually came right with this issue. I found conflicting jars in my classpath which I cleaned, and since then I have had no problems.
  • 您可以使用log4j,它是hadoop使用的默认日志记录框架。 因此,从MapReduce应用程序中,您可以执行以下操作: import org.apache.log4j.Logger; // other imports omitted public class SampleMapper extends Mapper { private Logger logger = Logger.getLogger(SampleMapper.cla ...
  • 实际上这是我的配置错误: 我错过了mapred-site.xml中的 mapred.local.dir属性 mapred.local.dir /usr/local/hadoop-1.0.3/local Actually it was my configuration mistake: I missed mapred.local.dir property in mapred-sit ...
  • 单个映射器是否在一台机器中使用多个线程? 是。 Mapreduce作业可以使用多线程映射器( 多线程或线程池运行map方法 )。 我已经使用了更好的CPU利用率来仅映射Hbase作业 ...... 如果您的操作高度CPU密集, MultiThreadedMapper非常适合,可以提高速度。 mapper类应该扩展org.apache.hadoop.mapreduce.lib.map.MultithreadedMapper而不是常规的org.apache.hadoop.mapreduce.Mapper 。 M ...
  • 我最终解析了jobId,删除了'job'前缀并添加了'application'前缀,因为看起来applicationId没有为mapreduce作业公开,它与具有不同前缀的jobId基本相同。 这是一个hacky方法,但现在工作。 I ended up parsing the jobId, removing 'job' prefix and adding 'application' prefix as it appears applicationId is not exposed for mapreduce ...