Hadoop源码解析

一、hadoop的Job 提交流程源码

流程图:
在这里插入图片描述

1.从我们编写的mapreduce的代码中进入job提交源码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
支线一:进入connect();
在这里插入图片描述
在这里插入图片描述
2.支线二:进入submitter.submitJobInternal(Job.this, cluster),向集群提交了job信息,这里是提交job任务的核心代码
在这里插入图片描述

在这里插入图片描述
该方法(submitter.submitJobInternal(Job.this, cluster))往下翻:
在这里插入图片描述

存入了切片信息的本地路径
在这里插入图片描述
submitter.submitJobInternal(Job.this, cluster)方法继续往下走
在这里插入图片描述
在这里插入图片描述
退出到最先进入的方法:
在这里插入图片描述
总结重点:job提交流程源码重点是在本次提交中,集群模式提交了jar包,切片信息和job相关参数信息的xml文件。

二、hadoop的Job 提交流程切片源码

上面Job提交流程中有切片部分,单独拎出来分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该方法继续往下走
在这里插入图片描述
总结重点:切片大小默认是这样computeSplitSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M,公司里也一般是这个,不过可以修改,切块大小不是精准128M切,而是每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一块切片。

三、hadoop之NameNode 启动源码解析

NameNode启动代码路线,主要做了途中6件事儿,也就六个路线,接下来一个路线一个路线分析
在这里插入图片描述
1.搜索NameNode类,找到main方法,根据图线路径找到startHttpServer方法
①启动9870端口服务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该方法往下翻
在这里插入图片描述
②加载镜像文件和编辑日志
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③初始化NN的RPC服务端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
④NameNode启动资源检查
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⑤ DataNode心跳超时判断
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⑥ 安全模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结重点:记住namenode的启动六个主要事情: ①启动9870端口服务②加载镜像文件和编辑日志
③初始化NN的RPC服务端④ NN启动资源检查
⑤DN心跳超时判断⑥ 安全模式

四、hadoop之DataNode 启动源码解析

datanode的工作机制:
在这里插入图片描述
整体的源码流程:
在这里插入图片描述
①初始化DataXceiverServer
在这里插入图片描述
从DataNode.java的main方法往里找,最终找到startDataNode方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
②初始化HTTP服务,dataNode也有专用的页面,只是用的比较少,如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③初始化DN的RPC服务端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
④DN向NN注册
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
回到doRefreshNamenodes方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
回到connectToNNAndHandshake()
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⑤DN向NN发送心跳
在这里插入图片描述
退回到之前的和方法connectToNNAndHandshake()一个层级的run()方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进入updateHeartbeat方法->updateHeartbeat-方法>-updateHeartbeat方法->updateHeartbeatState
在这里插入图片描述
总结重点:记住namenode的启动五个主要事情: ①初始化DataXceiverServer②初始化HTTP服务
③初始化DN的RPC服务端④ DN向NN注册
⑤ DN向NN发送心跳

五、Hadoop之HDFS 上传源码解析

HDFS是写流程:
在这里插入图片描述
整体的源码流程
在这里插入图片描述
①通过RPC使NN创建create目录
在这里插入图片描述
通过代码路线来到NN的RPC客户端create
在这里插入图片描述
在这里插入图片描述
根据代码路线来到addFile方法之前的startFile方法下
在这里插入图片描述
在这里插入图片描述
②创建一个目录,接下来就创建一个输出流
在这里插入图片描述

回到newStreamForCreate方法下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③起了一个线程,准备了一个阻塞数据队列,用于往datanode写数据
在这里插入图片描述

回到newStreamForCreate方法下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

④向datanode写入数据
在这里插入图片描述
根据代码路线找到FSOutputSummer.write
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
继续往下看该方法
在这里插入图片描述
在这里插入图片描述
回到DataStreamer的run方法,查看阻塞队列有数据后的从客户端写到datanode的过程
在这里插入图片描述
查看第二部分的nextBlockOutputStream():nextBlockOutputStream()就是获取对应的block信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击一连串的chooseTarget,来到了BlockPlacementPolicyDefault类的chooseTarget方法
在这里插入图片描述
在这里插入图片描述
回到nextBlockOutputStream方法
在这里插入图片描述
在这里插入图片描述
该方法继续往下看
在这里插入图片描述
在这里插入图片描述
开始查看datanode的DataXceiverServer接收到客户端的socket开始写入数据的过程
找到DataXceiverServer类的run方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当第一个节点写完成之后,准备往第二个写,回到DataXceiver的writeBlock方法
在这里插入图片描述
继续往下看该方法,往第二个节点写入
在这里插入图片描述
单个节点都写完只有开始应答,接下来去查看应答的代码,回到DataStreamer的run方法
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
回到写数据的部分,回到DataStreamer的run方法,他们在写block的时候,先删除dataQueue,再将数据加入到ackQueue
在这里插入图片描述
总结重点:①客户端创建了RPC客户端,发送给NameNode进行请求,NameNode的进行判断,路径是否存在,是否有权限。②接下来客户端创建了一个DataStreamer,这个对象里面存储管理了一个数据阻塞队列dataQueue,并且该对象还通过RPC向NameNode获取写入哪些datanode节点(机架感知策略)③开始真正的写入数据先写chunk,够127个形成一个packet,将packet往dataQueue写,其中判断dataQueue是否满,满了就等待,当写入之后,DataStreamer就开始处理,通过Socket请求发送packet,发送之前先在dataQueue删除,然后放入ackqueue一份,发送之后datanode的DataXceiverserver服务将数据先写入磁盘,再继续通过socket发送到下一个节点,下一个节点接受再写入磁盘并socket发送下一个节点,第三个节点写完之后,向第二个节点应答,然后第二个节点向一个节点应答,应答完之后ResponseProcessor告诉ackqueue删除备份的数据,并继续写下一packet,如果没有写datanode成功,就会将ackqueue的写失败的packet再放入datanode中再往datanode写。所有packet写完之后关闭流,结束上传。

猜你喜欢

转载自blog.csdn.net/weixin_44468025/article/details/124900440