学习hadoop先从搞懂作业运行机制开始,不看懂运行机制总感觉MapReduce的执行是一件很神秘的事情,现在来解开她的神秘面纱,本想自己看看书就算了,但是记忆力真的是个好东西,然而我却没有。。。只好把看到的内容记下来,也好留下更深的印象。另外,本文内容摘抄自《hadoop权威指南第3版》。
jobtracker接收到对其的submitjob()方法的调用后,会把此调用放入一个内部队列中,交由作业调度器进行调度,并对
其进行初始化。初始化包括创建一个表示正在运行作业的对象,用于封装任务和记录信息,以便跟踪任务的状态和进程。
作业调度器首先从客户端也就是master节点获取已经计算好的输入分片,为每个分片创建一个map任务,reduce任务个数取决于一些设置,任务在此时被指定id。
除了map任务和reduce任务还会创建两个任务:作业创建和作业清理。在map任务运行之前运行代码来创建作业,并在reduce任务完成之后完成清理工作。作业创建为作业创建输出路径和临时工作空间,作业清理清除作业运行过程中的临时目录。
tasktracker被分配任务后,就该运行该任务,第一步,从共享文件系统中复制jar文件到tasktracker所在的文件系统,将文件从分布式缓存中复制到本地磁盘,第二步,tasktracker为任务新建一个本地工作目录,并把jar文件解压到该工作目录,,第三步,tasktracker新建一个taskrunner实例运行该任务。
taskrunner启动一个新的JVM来运行每个任务,每个任务都能执行搭建和清理动作,它们和任务在一个jvm中执行,清理动作用于提交任务,在基于文件的作业中意味着它的输出写到该任务的最终位置。在Streaming和pipes中,任务执行过程中,Java进程把输入键值对传给外部进程,外部进程用过用户定义的map和reduce函数来执行并把输出的键值对传回给Java进程。从tasktracker的角度看,就像tasktracker的子进程自己处理map和reduce代码一样。