2021SC@SDUSC
1.Hadoop中的NameNode与DataNode
Hadoop中的HDFS系统包括一个NameNode和多个DataNode。NameNode为管理者,主要负责管理HDFS中的文件系统,它维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。而DataNode负责存储数据,一个数据块在多个 DataNode 中有备份;而一个 DataNode 对于一个块最多只包含一个备份。
一个 HDFS 集群可能包含上千 DataNode 节点,这些 DataNode 定时和 NameNode 通信,接叐收NameNode 的指令。为了 减轻 NameNode 的负担,NameNode 上并不永久保存那个 DataNode 上有那些数据块的信息,而是通过 DataNode 启动定时上报,来更新 NameNode 上的映射表。 DataNode 当然也作为服务器接收来自客户端的访问,处理数据块读/写请求。DataNode 之间还会相互通信,执行数据块复制任务,同时,在客户端做写操作的时候,DataNode 需要相互配合,保证写操作的一致性。 从大到小,Hadoop 中最大的结构 是 Storage,最小的结构,在 DataNode 上是 block。 类 Storage 保存了和存储相关的信息,它继承了 StorageInfo。 StorageDirectory 还管理着文件系统的元信息,,StorageDirectory 还保存每个具体用途自己的信息。这些信息,其实都存储在 VERSION 文件中,StorageDirectory 中的 read/write 方法,就是用于对这个文件进行读/写。 DataNode配置文件的相关代码:1. #Fri Nov 14 10:27:35 CST 2008 2. namespaceID=1950997968 3. storageID=DS-697414267-127.0.0.1-50010-1226629655026 4. cTime=0 5. storageType=DATA_NODE 6. layoutVersion=-16
2.FSDataset 相关的类
FSDataset 实现了接口 FSDatasetInterface。FSDatasetInterface 是 DataNode 对底局存储的抽象。 FSDataset关键变量:FSVolumeSet volumes; private HashMapvolumes 就是 FSDataset 使用的所有 Storage,ongoingCreates 是 Block 刡 ActiveFile 的映射,只要是正在创建的 Block,都会记彔在 ongoingCreates 里。 FSDataset 中的方法:ongoingCreates = new HashMap (); private HashMap volumeMap = null;
public long getmetaDataLength(Block b) throws IOException;得到一个 block 的元数据长度。通过 block 的 ID,找对应的元数据文件,返回文件长度。
public metaDataInputStream getmetaDataInputStream(Block b) throws IOException;得到一个 block 的元数据输入流。通过 block 的 ID,找对应的元数据文件,在上面打开输入流。
public boolean metaFileExists(Block b) throws IOException;判断 block 的元数据的元数据文件是否存在。
public long getLength(Block b) throws IOException;求block 的长度。
public Block getStoredBlock(long blkid) throws IOException;通过 Block 的 ID,找到对应的 Block。
public void updateBlock(Block oldblock, Block newblock) throws IOException;
更新Block。
public void unfinalizeBlock(Block b) throws IOException;
取消打开的Block。
public boolean isValidBlock(Block b);
判断Block是否有效。
public void validateBlockmetadata(Block b) throws IOException;
检查Block的有效性。
在本次代码分析中,增加了我对于Hadoop中DataNode与NameNode作用的理解,以及对FSDataset类里的代码作用的理解。



