您的位置:首页 > 运维架构

【hadoop】map reduce任务提交后系统干嘛了

2012-09-08 20:51 417 查看

1、 文件上传

DFSClient向JobTracker提交任务之前,会将任务运行所需要的文件放入HDFS,从而可被JobTracker和TaskTracker得到:一般有执行文件,配置文件,input数据等

当Map-Reduce程序停在JobTracker.submitJob函数中的时候,让我们查看HDFS中有如下的变化:

bin/hadoop fs -ls /data/hadoopdir/tmp/mapred/system

其中多了一个文件夹job_201011202025_0001,这是当前运行的Job的ID,在这个文件夹中有我们传上去的文件。(路径可以设置,这个路径是用来保存客户端传上来的临时文件的)

jobtracker根据用户提交的信息,得到jobid,用户组及判断权限,另外将job的信息写到hdfs上,以便tasktracker能够访问。

2、 任务拆分

在JobTracker.submitJob的函数中,会读取这些上传到HDFS的文件,从而将Job拆分成Map Task和Reduce Task。

然后再调用addJob()方法,方法中会将job加入到jobs队列中,job队列采用了map数据结构,

Map<JobID,JobInProgress> jobs = new TreeMap<JobID, JobInProgress>();

可以很方便的通过jobid找到该job相应的JobInProgress对象。同时也会加入到JobInProgressListener类中,此类主要是用来监听job的类。完成后,最后将返回job的状态。

当 TaskTracker通过heartbeat向JobTracker请求一个Map Task或者Reduce Task来运行。

3、 任务本地化

tasktracker开始去获取一个task,获取task是通过FairScheduler实现的。FairScheduler是hadoop中的作业公平调度器,主要是解决当TT发送心跳告诉JT当前的空闲slots时,希望JT分配给TT相应多个task,让TT去执行这些task。所以JT就需要一个调度器来对作业进行调度,选择出作业,然后将作业的task分配TT去执行。而hadoop中的task可以分为map,reduce,jobsetup,jobcleanup,taskcleanup这五种task。更多细节请参见:FairScheduler(公平调度器)的源码阅读

当TaskTracker得到一个Task的时候,它会调用TaskTracker.localizeJob将job运行的三个文件从HDFS中拷贝到本地文件夹,然后调用TaskInProgress.localizeTask创建Task运行的本地工作目录。

程序停在做完localizeTask后,tasktracker上的/data/hadoopdir/tmp/mapred/local/taskTracker/jobcache下多了一个文件夹job_201011202025_0001

4、 执行

接下来要创建Child JVM来执行Task

5、 reduce

Reduce Task包括三个过程:copy,sort,reduce

拷贝过程即将所有的map结果复制到reduce task的本地

在拷贝的过程中,有一个背后的线程会对已经拷贝到本地的map.out进行预先的合并,形成map.merged文件,合并的规则是按照 io.sort.factor来进行合并,对于我们的配置就是两两合并,下面我们看到的就是map_2.out和map_3.out合并成 map_3.out.merged,在另外两个还没有合并的时候,拷贝过程结束了,则背后的合并进程也就结束了。

reduce的过程就是循环调用reducer的reduce函数,将结果输出到HDFS中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐