一、浏览 HDFS 源码的缘由
HDFS 是大数据的最基础的设备了,简直一切的离线存储都在 HDFS 上。
然而在大规模 HDFS 集群中,上方的疑问通常会让咱们无比头疼:
以上种种疑问,都须要咱们浏览源码,甚至要修正它的源码能力处置。
所以虽然浏览源码十分痛苦,然而这个坎还是得过的。
二、如何浏览 Hadoop 这样的百万行代码的开源名目
首先 hadoop 是用 java 写的,所以一些 java 基础常识必无法少,比如锁,线程,设计形式,java 虚构机,javaio,不求很深化,基础得悉道。
其次,不能一行行的读代码,这样很容易迷失在无际际的代码中,逃不出来,最后很容易就丢弃了。
最后,以详细场景来驱动代码浏览。比如本文就是以 NameNode 的启动环节,来驱动代码浏览的。并且把关键的流程节点和类用流程图记载上去。
三、源码走读
找到 NameNode 类
从 main 方法开局,创立 NameNode
进入这个方法:
有很多的 switch case ,因为咱们启动命令是 hadoop-daemon.sh start namenode,所以间接运转到 default外面:
这是个比拟关键的方法,实例化:
实例化方法里,有个比拟关键的操作,startHttpServer(conf),启动 50070 端口,就是咱们 50070 那个界面:
出来,经常使用 ip 和 端口创立了 HttpServer
再来看这个 start 方法
进入 start 方法,发现创立了一个 HttpServer2,这是 Hadoop 自己封装的服务
然后绑定了很多 Servlet,每个 Servlet 都是一特性能
可以看到画红线的,就是每特性能的地址。假构想看每特性能怎样成功的,可以点出来 Servlet,看它的 doGet 或许 doPost 或许 doPut方法。
看完了这个,再退回到 NameNode 类中,然后就是去加载元数据(先不细看)
然后是创立 RPC 服务端,启动一个服务端,给别的组件调用
看这个方法:
看这个中央,这个就是经常使用 hadoop 的 RPC ,来创立一个 RPC 服务端了。此时咱们在 NameNodeRpcServer 类中。
创立了之后,再回到 NameNode 中,发现这个 NameNodeRpcServer 是 NameNode 类的一个属性,意思是,NameNode委托这个类去启动了 NameNodeRpcServer,在设计形式中,属于组合。
然后咱们再来看这个 NameNodeRpcServer ,成功了很多的协定:
咱们尝试在 ClientProtocol 中,找一找能否有创立目录的方法。
发现是有的,所以 NameNodeRpcServer 会去成功这个方法的。
到时刻 NameNode 启动之后,就会往外提供服务了。
然后咱们再回到 NameNode 类,看最后一些性能:
startCommonServices,关键做了两件事情,启动资源监察,审核磁盘够不够;审核能否可以分开安保形式。
这个方法会审核性能文件中 fsimage 的目录 和 editlog 的目录磁盘资源能否短缺。
最终会把磁盘能否足够的布尔值赋值给这个变量。
然后会判别能否进入安保形式:
进入这个方法中:
这个 getCompleteBlocksTotal() 前往的是能反经常常使用的 Block 个数。
这个是怎样算的呢?
在 HDFS 中,存在两种类型的 Block,一种是 Complete 类型,即为反常可用的 Block;另一种是 underconstruction类型,处于正在构建的 Block,相减,就是反常可用的 Block 个数了。
然后进入 checkMode 方法
出来之后,有一个 needEnter() 方法,这个方法里,判别了能否进入安保形式
这外面有三个进入安保形式的条件:
咱们来看第一个条件:
threshold 自动性能是 0.999 ,不等于0;
blockSafe 可以在类中搜查一下。
这个就示意,DataNode 每次心跳都要和 NameNode 汇报 自己的 Block 个数,每次汇报,这个值都会加 1.
假设>