本文为作者学习Hadoop源码时的一些总结,可能会有理解错误的地方,学艺不精请谅解
HDFS上产源码解析 create创建过程1.DN向NN发起创建请求,NN检查目录是否存在,是否可以覆盖,若满足,则addINode创建目录
2.NN处理DN的创建请求,创建输出流
3.启动线程DataStreamer,创建数据dataQueue队列后阻塞等待
write上传过程1.向DataStreamer的队列里面写数据,写Chunk和CheckSum(512+4byte)写够127个生成packet后进入dataQueue队列并通知队列让其进行处理
2.队列获取第一个数据,建立管道(与NN通讯获取对应的块信息)即机架感知
3.建立管道,Socker请求发送packet,先发送,然后把数据在data队列移除,同时写入到ack队列
4.建立管道,Socker请求继续发送packet,把packet写入磁盘,然后发送到下一个节点(即为边写边发)
5.DN写完数据后应答Response,若是写成功就把ack队列首位移除掉,失败的话就把ack队列首位移到data队列首位(ack首位同样也会移除)
MapReduce源码解析 Job提交源码1.创建提交Job的代理,判断是本地运行环境还是yarn集群运行环境
2.创建给集群提交数据的Stag路径,获取jobid,并创建Job路径,拷贝jar包到集群,计算切片,生成切片规划文件,向Stag路径写XML配置文件
3.提交Job,返回提交状态
MapTask源码解析1.每次Map方法结束都会进入到环形缓冲区中对元数据KeyStart,ValueStrat序列化,这也是Key Value是自定义Bean类要继承Writable接口的原因
2.Map数据处理结束后再到环形缓冲区会排序并溢写(数据量小不到环形缓冲区混洗占比的情况下),不论有几个分区都会写到一个文件中(会有索引标识所属分区),溢写结束后会进行归并排序
3.归并排序结束后会生成index文件,文件中存储着数据的分区信息,即账本,自此MapTask基本上处理结束即将进入ReduceTask
ReduceTask源码解析 ReduceTask上来就分成了三个阶段,copy,sort,reduce(源码中分的)1.初始化,获取MapTask个数,决定拉取几个几个分区的数据,提前准备好内存和磁盘
2.初始化结束进入run方法开始拉取数据,自此copy阶段完成,当前状态立即切换为sort状态,归并排序后sort阶段结束开始reduce阶段
3.进入到Reduce方法,按照Key开始写数据,若是key或Value为自定义Bean类,会调用此类的ToString方法决定格式
Yarn源码解析1.准备工作(提交xml,切片信息,jar包)
2.yarn客户端向RM提交一个命令,让RM帮忙完成这个命令
3.RM完成命令即启动MRAppMaster,启动之前先初始化MRAppMaster(创建了一个任务调度器,此调度器不是Yarn的任务调度器是MRAppMaster的)
4.MRAppMaster把任务提交到Yarn的调度器队列中并执行(队列中由yarnChild执行)
5.yarnChild执行任务分MapTask和Reduce Task,MapTask分两阶段,Map阶段(map方法冲处理的事情)和Sort阶段(Map方法出去后环形缓冲区中排序),判断若是ReduceTask==0,也就是没有Reduce阶段,则不会有Sort阶段,资源会全部给Map阶段,若是会走sort,也就是有Reduce阶段,则Map占比66.7,Sort占比33.3,也就是如果mr程序map没有执行到66.7%就出了问题,则问题出在Map方法中,若是执行过了66.7然后出了问题,问题就出在Sort阶段环形缓冲区中即资源出了问题



