Hadoop 的源码 如何浏览百万行

一、浏览 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.

假设>

您可能还会对下面的文章感兴趣: