Hadoop 用了2年多了.从最初一起创业的11人20台服务器集群到后来独立搭建基于hadoop nutch的搜索引擎并商用化 到现在也2年了.这两年来应用了很多新技术也经历了很多,从数据仓库的Hive pig 到mapreduce的编码去解决算法或是etl的问题 等等都离不开hadoop.觉得用了2年多也到了该总结的时候了.故此想重新翻译hadoop 源码,按照不同的类方法的不同作用.也希望读到这篇博客的人和我一起 经历这一段岁月,一起讲hadoop的核心结合实用主义 传递给中国的开源软件使用者。
下图为 jobClient 提交到 Mapreduce 作业到JobTracker 核心逻辑。
1.JobProfile类:
job的描述性元语,相当于bean的功能.其中包括:
user job的提交者
jobid 唯一的标志一个job的ID ->JobID 类生成:
--jobid 包括两部分.第一部分代表jobTracker 标志,第二部分代表时间.如果是本地job(local Job) 则为local,最后为 job数量,代表是第 几个job
jobFile job运行时文件
url 定位该条job的描述性信息url
name job的名字
queueName job 队列名称,
2.JobStatus 类:
-- job的几种状态
running
successed
failed
prep
killed
3.copyAndConfigureFiles() 方法:
1.JobSubmissionFiles 工具类 负责管理 job 相关文件:
conf 路径
jar 包路径
分布式缓存(distributed cache files(archives,
libjars,)) 路径
拷贝job执行文件到 job执行目录
4.writeNewSplits()
mapred.max.split.size 设置最小输入分片
mapred.max.split.size 最大分片的大小
计算输入分片
FileInputFormat ->
getSplits()->computeSplitSize()
方法
分片计算法:
1.首先 获取文件的长度 length
2.获取blocksize
3. 获取最 大分片大小 getMaxSplitSize
4.取 maxsize 和 block 中 的较小者 A
5. 取 最新分片和 A 中的最大者 作为分片大小
6.如果文件长度 length/分片大小 >1.1 则调用FileSplit 分片
FileInputFormat 类:
setInputPaths((
Job job,
Path... inputPaths) 可添加多个输入路径