2021SC@SDUSC
1.NameNode上的线程
Daemon hbthread = null; // HeartbeatMonitor thread public Daemon lmthread = null; // LeaseMonitor thread Daemon smmthread = null; // SafeModeMonitor thread public Daemon replthread = null; // Replication thread private Daemon dnthread = null;PendingReplicationBlocks 中也有一个线程:
Daemon timerThread = null;心跳线程用于对 DataNode 的心态进行检查,以间隔 heartbeatRecheckInterval 运行 heartbeatCheck 方法。如果在一定时间内没收到 DataNode 的心跳信息,我们就认为该节点已经死掉,调用 removeDatanode将 DataNode 标记为无效。
void recoverCreate(Collection和 FSImage.coverTransitionRead 类似,用于分析现有目录,创建目录并从可能的错误中恢复。dataDirs, Collection editsDirs) throws IOException
private void doMerge(CheckpointSignature sig) throws IOExceptiondoMerge 被类 SecondaryNameNode 的同名方法调用。 2.Secondary NameNode 成员变量:
private CheckpointStorage checkpointImage;Secondary NameNode 使用的 Storage
private NamenodeProtocol namenode;和 NameNode 通信的接口
private HttpServer infoServer;传输文件用的 HTTP 服务器 main 方法是 Secondary NameNode 的入口,它最终启动线程,执行 SecondaryNameNode 的 run。启动前的对SecondaryNameNode 的构造过程也简单,主要是创建和 NameNode 通信的接口和启动 HTTP 服务器。SecondaryNameNode 的 run 方法每隔一段时间执行 doCheckpoint(),从 NameNode 的主要工作都在这一个方法里。 newBlockReader 最复杂的请求:
public static BlockReader newBlockReader( Socket sock, String file, long blockId, long genStamp, long startOffset, long len, int bufferSize, boolean verifyChecksum, String clientName) throws IOException其中,sock 为到 DataNode 的 socket 连接,file 是文件名(只是用于日志输出) 该方法会和 DataNode 进行对话,收送上面的读数据块的请求,处理应答并构造 BlockReader 对象。 DFSInputStream,它封装了 DFSClient 读文件内容的功能。在它的内部,不但要处理和 NameNode 的通信,同时通过 BlockReader,处理和 DataNode 的交互。 DFSInputStream 记彔 Block 的成员变量:
private LocatedBlocks locatedBlocks = null;不但保持了文件对应的 Block 序列,还保持了管理 Block 的 DataNode 的信息,DFSInputStream 中最重要的成员变量。 DFSInputStream 的构造函数,通过类内部的 openInfo 方法,获取这个变量的值。openInfo 间接调用了 NameNode 的 getBlockLocations,获取 LocatedBlocks。
synchronized List在打开到 DataNode 前, blockSeekTo 会调用 chooseDataNode,选择一个现在活着的 DataNode。getAllBlocks() throws IOException private LocatedBlock getBlockAt(long offset) throws IOException private synchronized List getBlockRange(long offset, long length) private synchronized DatanodeInfo blockSeekTo(long target) throws IOException



