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

来源:互联网 发布:linux cpu使用率过高 编辑:程序博客网 时间:2024/05/18 17:01

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实现的。FairSchedulerhadoop中的作业公平调度器,主要是解决当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中。