2021SC@SDUSC
一.NameNode.java
先来分析NameNode.java的成员变量
在之前的文章中已经介绍了,NameNode 实现了接口 ClientProtocol,DatanodeProtocol 和 NamenodeProtocol,分别提供给客户端/DataNode/从 NameNode 访问。 1. 指向 FSNamesystem 对象public FSNamesystem namesystem;
2.NameNode 的 RPC 服务器实例
private Server server;
3.处理回收站的线程句柄:
private Thread emptier;
4.server 中服务器请求处理线程的数目:
private int handlerCount = 2;
5.是否支持 append 操作:
private boolean supportAppends = true;
6.NameNode 的地址,包括 IP 地址和监听端口:
private InetSocketAddress nameNodeAddress = null;
二.NameNode的启动过程:
main 方法是系统的入口,它会调用 createNameNode 创建 NameNode 实例。 createNameNode 分析命令行参数,如果是 FORMAT 或 FINALIZE,调用对应的方法后退出,如果是其他的参数,将创建NameNode 对象。NameNode 的构造函数会调用 initialize,初始化NameNode 的成员变量,包括创建 RPC 服务器,初始化 FSNamesystem,启动 RPC 服务器和回收站线程。FSNamesystem 的构造函数会调用 initialize 方法,去初始化成员变量。几个重要的步骤包括加载 FSImage,设置系统为安全模式,启动各个工作线程和 HTTP 服务器。
三.NameNode 上实现的 ClientProtocol getBlockLocations 用于确定文件内容的位置,它的输入参数为:文件名,偏移量,长度,返回值是一个 LocatedBlocks 对象。 getBlockLocations 直接调用 NameSystem 的同名方法。NameSystem 中这样的方法首先会检查权限和对参数进行检查(如偏移量和长度要大于 0),然后再调用实际的方法。找 LocatedBlocks 先找 src 对应的 INode,然后通过 INode 的 getBlocks方法,可以拿到该节点的 Block 列表,如果返回为空,表明该 INode 不是文件,返回 null;如果 Block 列表长度为 0,以空的Block 数组构造返回的 LocatedBlocks。 如果 Block 数组不为空,则通过请求的偏移量和长度,就可以把这个区间涉及的 Block 找出来。public boolean setReplication(String src, short replication ) throws IOException;setReplication,设置文件 src 的副本数为 replication,返回值为 boolean,在 FSNameSystem 中,调用方法setReplicationInternal,然后写日志。
public void setPermission(String src, FsPermission permission ) throws IOException;setPermission,用于设置文件的访问权限。非常简单,首先检查是否有权限,然后调用 FSDirectory.setPermission 修改文件访问权限。
public void setOwner(String src, String username, String groupname ) throws IOException; public void setTimes(String src, long mtime, long atime) throws IOException; public void setQuota(String path, long namespaceQuota, long diskspaceQuota) throws IOException;setOwner,设置文件的文件主和文件组,setTimes,设置文件的访问时间和修改时间,setQuota,设置某路径的空间限额和空间额度,和 setPermission 类似,调用 FSDirectory 的对应方法。
public boolean setSafeMode(FSConstants.SafeModeAction action) throws IOException;客户端通过上面的方法,可以让 NameNode 进入(SAFEMODE_ENTER)/ 退出(SAFEMODE_LEAVE)安全模式或查询(SAFEMODE_GET)状态。FSNamesystem 的 setSafeMode 处理这个命令,对于进入安全模式的请求,如果系统现在不处亍安全模式,那么创建一个 SafeModeInfo 对象,这标志着系统进入安全模式。
public FileStatus[] getListing(String src) throws IOException;getListing 对应于UNIX 系统的 ls 命令,返回值是 FileStatus 数组。
public DatanodeInfo[] getDatanodeReport(FSConstants.DatanodeReportType type) throws IOException;getDatanodeReport,获取当前DataNode的状态。 FSNamesystem的同名方法调用 getDatanodeListForReport,通过 HostsFileReader 读取对应信息。
public long getPreferredBlockSize(String filename) throws IOException;getPreferredBlockSize,返回 INodeFile.preferredBlockSize。 体会:NameNode里面的代码真的很多,也是hadoop源码里的重要组成部分。



