栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Hadoop源码分析(七)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hadoop源码分析(七)

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源码里的重要组成部分。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/592526.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号