预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共26页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

1)、客户端 Map-Reduce的过程首先是由客户端提交一个任务开始的。 提交任务主要是通过JobClient.runJob(JobConf)静态函数实现的: publicstaticRunningJobrunJob(JobConfjob)throwsIOException{ //首先生成一个JobClient对象 JobClientjc=newJobClient(job); …… //调用submitJob来提交一个任务 running=jc.submitJob(job); JobIDjobId=running.getID(); …… while(true){ //while循环中不断得到此任务的状态,并打印到客户端console中 } returnrunning; }其中JobClient的submitJob函数实现如下: publicRunningJobsubmitJob(JobConfjob)throwsFileNotFoundException, InvalidJobConfException,IOException{ //从JobTracker得到当前任务的id JobIDjobId=jobSubmitClient.getNewJobId(); //准备将任务运行所需要的要素写入HDFS: //任务运行程序所在的jar封装成job.jar //任务所要处理的inputsplit信息写入job.split //任务运行的配置项汇总写入job.xml PathsubmitJobDir=newPath(getSystemDir(),jobId.toString()); PathsubmitJarFile=newPath(submitJobDir,"job.jar"); PathsubmitSplitFile=newPath(submitJobDir,"job.split"); //此处将-libjars命令行指定的jar上传至HDFS configureCommandLineOptions(job,submitJobDir,submitJarFile); PathsubmitJobFile=newPath(submitJobDir,"job.xml"); …… //通过inputformat的格式获得相应的inputsplit,默认类型为FileSplit InputSplit[]splits= job.getInputFormat().getSplits(job,job.getNumMapTasks()); //生成一个写入流,将inputsplit得信息写入job.split文件 FSDataOutputStreamout=FileSystem.create(fs, submitSplitFile,newFsPermission(JOB_FILE_PERMISSION)); try{ //写入job.split文件的信息包括:split文件头,split文件版本号,split的个数,接着依次写入每一个inputsplit的信息。 //对于每一个inputsplit写入:split类型名(默认FileSplit),split的大小,split的内容(对于FileSplit,写入文件名,此split在文件中的起始位置),split的location信息(即在那个DataNode上)。 writeSplitsFile(splits,out); }finally{ out.close(); } job.set("mapred.job.split.file",submitSplitFile.toString()); //根据split的个数设定maptask的个数 job.setNumMapTasks(splits.length); //写入job的配置信息入job.xml文件 out=FileSystem.create(fs,submitJobFile, newFsPermission(JOB_FILE_PERMISSION)); try{ job.writeXml(out); }finally{ out.close(); } //真正的调用JobTracker来提交任务 JobStatusstatus=jobSubmitClient.submitJob(jobId); …… } 2)、JobTracker JobTracker作为一个单独的JVM运行,其运行的main函数主要调用有下面两部分: 调用静态函数startTracker(newJobConf())创建一个JobTracker对象 调用JobTracker.offerService()函数提供服务 在JobTracker的构造函数中,会生成一个taskSche