知识点
相关文章
更多最近更新
更多MapReduce作业提交源码分析
2019-03-28 13:25|来源: 网络
MapReduce作业提交源码分析
我们在编写MapReduce程序的时候,首先需要编写Map函数和Reduce函数。完成mapper和reducer的编写后,进行Job的配置;Job配置完成后,调用Job.submit()方法完成作业的提交。那我们思考一下,Job最终如何完成作业(job)的提交呢?粗略想一下,Job必然需要通过某种方式连接到JobTracker,因为只有这样才能将job提交到JobTracker上进行调度执行。还需要考虑一下,我们自己编写的mapper和reducer,即Jar文件如何传送到JobTracker上呢?其中有一种最简单也比较直观的方法,直接通过socket传输给JobTracker,由JobTracker再传输给TaskTracker(注意:MapReduce并没有采用这种方法)。第三个需要考虑的内容是,JobTracker如何将用户作业的配置转化成map task和reduce 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存放目录的分配后,JobClient向JobTracker申请一个JobID(通过RPC,注意基本上JobClient与JobTracker的所有通信都是通过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源码情景分析[2023-08-23]
关于内核的书不在多,而是要精,强烈推荐 《Linux内核设计与实现》,英文名Linux Kernel Development,机械工业出版社,¥35, 美国Robert Love著,陈莉君译。 此书是当今首屈一指的入门最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。对没怎么深入内核的人来说,这是强烈推荐的一本书。 -
《深入分析linux内核源码》[2022-08-04]
不好意思,我现在才看到消息, 我会尽快发到您的邮箱的。 -
如何对MFC源码进行分析呢?[2021-12-31]
谁说入口就一定是WinMain?很多自定义入口,而且控制台程序默认入口为main,对于MFC的入口,实际上他也是从WinMain开始的,只是WinMain并不在程序中显示,你去查一下头文件就知道了,或者在头文件WinMain设置断点,实际上他还会断在WinMain上,另外好像还有一个AfxMain,我忘记了你自己看头文件 -
如何在代码中提交Mapreduce作业?[2022-06-18]
MapReduce作业提交源码分析 我们在编写MapReduce程序的时候,首先需要编写Map函数和Reduce函数。完成mapper和reducer的编写后,进行Job的配置;Job配置完成后,调用Job.submit()方法完成作业的提交。那我们思考一下,Job最终如何完成作业(job)的提交呢?粗略想一下,Job必然需要通过某种方式连接到JobTracker,因为只有这样才能将job提交到JobTracker上进行调度执行。还需要考虑一下,我们自己编写的mapper和reducer,即Jar文件如何传 ... -
Hive MapReduce作业提交失败“目标是一个目录”(Hive MapReduce Job Submission fails “Target is a directory”)[2021-08-26]
我最终解决了这个问题。 我在我的类路径中找到了相互冲突的罐子,我清理过,从那时起我就没有问题了。 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 -
单个映射器是否在一台机器中使用多个线程? 是。 Mapreduce作业可以使用多线程映射器( 多线程或线程池运行map方法 )。 我已经使用了更好的CPU利用率来仅映射Hbase作业 ...... 如果您的操作高度CPU密集, MultiThreadedMapper非常适合,可以提高速度。 mapper类应该扩展org.apache.hadoop.mapreduce.lib.map.MultithreadedMapper而不是常规的org.apache.hadoop.mapreduce.Mapper 。 M ...
-
从提交的mapreduce作业中获取yarn applicationId(Get yarn applicationId from a submitted mapreduce job)[2022-06-11]
我最终解析了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 ...