免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2438 | 回复: 0

[Hadoop&HBase] hadoop0.1源码剖析(2) [复制链接]

论坛徽章:
0
发表于 2009-11-27 15:59 |显示全部楼层
很久没写了。今天来对hadoop0.1的源码分析加一点东西。

其实从hadoop的结构来说,计算部分mapreduce是建立在hdfs(hadoop distributed file system)模块上的,从阅读源码角度来说,肯定是要先阅读hdfs的。但是由于hdfs模块与真正实际的mapreduce算法相差甚远,为了直观起见,还是先讲mapreduce这个算法框架是如何在hadoop中实现的吧。

今天我记录的是Map任务是如何在hadoop中的生命周期。
下面是直接复制于我的笔记。

-----------------------我的笔记----------------------------------


MapTask的生命周期(虽然周期跨进程,但是整个周期都处在TaskTracker节点上,不存在处于不同节点的时刻)
---------------------------------Inside TaskTracker---------------------------------
1.在TT的offerService函数里获取Task
Task t=jobClient.pollForNewTask(taskTrackerName);
这个地方在JobTracker那走了一遭
2.把获取到的Task封装成TIP,并加入管理,TIP里从此多了个Task
TaskInProgress tip = new TaskInProgress(t, this.fconf);
这个地方在TIP的构造函数那走了一遭,把jobfile从HDFS那拖下来
加入管理就是TT的tasks和runningTasks
3.以后TT都只是用TIP对Task进行操作,这个时候用
TaskInProgress.launchTask();启动一个task

---------------------------------Inside TaskInProgress---------------------------------
4.创建个TaskRunner,TIP里从此多了一个TaskRunner
this.runner = task.createRunner(TaskTracker.this); TaskTracker
这个地方在MapTask的createRunner走了一遭 return new MapTaskRunner
5.对MapTaskRunner这个线程开启
也就是进入TaskRunner.start() --> TaskRunner.run()
TaskRunner这个线程的run方法是在TIP里使用的,目的是开启一个子进程,而MapTask或ReduceTask的run方法是在子进程里使用的,目的是做真正的事情

-------Inside MapTaskRunner(仍然在是TT开启的线程)----------------------
Run()
Prepare() -->MapTaskRunner.prepare()



Runchild()
拼凑命令行,最关键的命令行片段:
Child TTServer's:port taskID
该子进程伴随着一个输出监视线程,该线程运行在TT空间内

----------------------Inside Child(进入子进程,脱离TT)-----------------------------
6.从命令行获取TTServer:port和taskid
String taskid
TaskUmbilicalProtocol umbilical = RPC.getProxy()
Task task = umbilical.getTask()
开启ping线程 ping线程和MapTask.run同时运行
准备进入MapTask的run方法,从此子进程进入真正实质性做事情的阶段

----------------------Inside MapTask.run (仍然在子进程中)*****---------------
7.进入MapTask后,依次执行如下操作:
获取reduce个数int partition
构造partition个输出文件
构造partition函数(HashPartition(JobConfigurable))
构造OutputCollector函数(collect() { outfile.append(key,value)})
如果有combine,就构造CombiningCollector
构造RecordReader in(从输入读,从FileSplit读)
构造MapRunner(输入,输出,reporter)
进入MapRunner.run()
返回后调用TaskRunner.done(Umbilical)
8.进入MapRunner.run()
Read(key,value)
Map(key,value,collect)  用户的Mapper函数结合
这个地方是最耗时的部分,循环很多次

----------------------子进程结束MapTask结束--------------------------------------------




-----------------------我的笔记结束----------------------------------

其实在讲Map任务的生命周期之前,最好先讲MapReduce的任务调度策略,也就是一个任务是怎么在JobTracker(主控节点)上被调度出来的。留给以后讲吧。

另外,Reduce任务的生命周期我在做好笔记后会摘抄到这里。其实Reduce任务的生命周期和MapTask的生命周期有60%是一样的。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/105041/showart_2105588.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP