欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

程序员文章站 2022-05-02 12:05:44
最近在跟着一个大佬学习Hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程。想到了这个废弃已久的blog账号,决定重新开始更新。 主要分以下几步来进行源码学习: 一、搭建源码阅读环境二、源码项目结构概览及hdfs源码包结构简介三、NameNode介绍 第一步,搭建源码阅读环境。 把Ha ......

最近在跟着一个大佬学习hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程。想到了这个废弃已久的blog账号,决定重新开始更新。

主要分以下几步来进行源码学习:

一、搭建源码阅读环境
二、源码项目结构概览及hdfs源码包结构简介
三、namenode介绍

 

第一步,搭建源码阅读环境。

把hadoop源码包导入到开发工具,eclipse或者idea都行。这里我的环境是mac os,使用的工具是idea,hadoop版本为2.6.5。

首先,解压缩hadoop源码包,可以选择移动解压之后的源码包到idea工作空间

然后打开idea,选择import project,指定工作空间里的源码包路径

选择maven,下一步

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

勾选红框内选项,下一步。

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

勾选红框内选项选项,下一步。

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

继续下一步,

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

继续下一步,

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

点击完成,等待maven下载依赖,然后就导入成功了。

需要注意的是导入的时候maven需要下载很多依赖,所以这个过程可能会稍微长一些,耐心等候即可。

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

项目结构如下,

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

 

参考链接:https://blog.csdn.net/twj0823/article/details/84560878

第二步,项目结构概览及hdfs项目包简介。

hadoop是一个庞大的项目,源码包导入idea之后,可以发现里面又按照功能分为很多不同的小项目,比较耳熟能详的有hdfs、mapreduce、yarn等,

还有别的一些功能性的组件以及新增的特性功能。点开packages视图,包结构如下:

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

此处暂时只针对hdfs模块的namenode进行分析。点开hadoop-hdfs之后,发现也是按照功能进行分包的结构:

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

  可以自己查看一下各个包里的内容。namenode属于服务器上的一个进程,所以是在server包下。server包除了有namenode,还有datanode、

  blockmanagement、common、protocol等包。先把目标锁定在namenode,里面大致有ha高可用、快照处理、启动进程、网络资源等模块

Hadoop源码学习笔记之NameNode启动流程分析一:源码环境搭建和项目模块及NameNode结构简单介绍

  

第三步,namenode类简单介绍。

  namenode类在下边一堆的类文件中间的位置,至此,目标终于找到,开始切入正题了。阅读源码是一个非常好的学习方法,不仅可以学习到底层的

  技术实现机制,还可以通过查看核心代码梳理整个调用流程。

  首先,要学会看注释,除了通过梳理核心代码流程可以得知整个代码结构之外,通过注释可以更清晰的知道代码的意图。比如看一段繁杂的代码绕来绕去、

  晕头转向,而注释就是专门给人看的东西,帮助我们在看代码的时候有一个大致的推测方向。

  所以,namenode的这段注释已经很明白的说明了namenode的功能和构成:

/**********************************************************
 * namenode serves as both directory namespace manager and
 * "inode table" for the hadoop dfs.  there is a single namenode
 * running in any dfs deployment.  (well, except when there
 * is a second backup/failover namenode, or when using federated namenodes.)
 *
 * the namenode controls two critical tables:
 *   1)  filename->blocksequence (namespace)
 *   2)  block->machinelist ("inodes")
 * 
 * the first table is stored on disk and is very precious.
 * the second table is rebuilt every time the namenode comes up.
 *
 * 'namenode' refers to both this class as well as the 'namenode server'.
 * the 'fsnamesystem' class actually performs most of the filesystem
 * management.  the majority of the 'namenode' class itself is concerned
 * with exposing the ipc interface and the http server to the outside world,
 * plus some configuration management.
 **********************************************************/

  上面两段话 主要是说,namenode管理两类数据:

    1.filename -> blocksequence (namespace) 

     文件到block的映射,上传的文件被切分为多个block(128m),这份映射数据就是namespace,存储在磁盘上。

    2.block -> machinelist (inodes)
     
block到datanode的映射,每个block都会分配给一个datanode,每个block还有3个副本,也就是每个block对应多个datanode,

     这个映射数据就是inodes。在namenode每次启动的时候,由datanode汇报过来的。

  最下面一段话的字面意思是,namenode主要由fsnamesystem、namenode本身、namenodeserver三部分构成。

  其中,fsnamesystem是用来执行文件系统管理的,namenode被用来处理外部的远程调用,包括http服务以及一些配置管理。

  这段话想表达什么意思呢?

  fsnamesystem执行文件系统管理,这个好理解,就是负责管理元数据。

  namenode处理外部远程调用以及http服务怎么理解?其实就是说,namenode主要干了两件事情:

    1.处理一些配置属性,就是core-site.xml、hdfs-site.xml等文件里的配置;

    2.启动namenodeserver(分为namenodehttpserver和namenoderpcserver),对外监听某个端口,处理接收到的http/rpc请求。比如请求

     这两个server进行创建目录、上传/下载文件等一些操作。

  以上就是namenode的功能和组成的大概介绍。

  然后,结合linux上运行jar文件的经验,查看该jar的进程,发现进程名字其实就是jar中被指定执行的java类文件名。hadoop集群的主节点namenode

  进程也是如此,由此想进一步知道namenode的启动流程,可以通过namenode类的main()入口进去查看。下一篇继续进行源码深入剖析。