深入理解 Hadoop (一)网络通信架构与源码浅析
深入理解 Hadoop (二)HDFS架构演进
深入理解 Hadoop (三)HDFS文件系统设计实现
深入理解 Hadoop (四)HDFS源码剖析
深入理解 Hadoop (五)YARN核心工作机制浅析
深入理解 Hadoop (六)YARN核心设计理念与工作流程剖析
深入理解 Hadoop (七)YARN资源管理和调度详解
HDFS 集群启动脚本 start-dfs.sh 分析
启动 HDFS 集群总共会涉及到的角色会有 namenode, datanode, zkfc, journalnode, secondaryName 共五种角色。
JournalNode 核心工作和启动流程源码剖析
// 启动 JournalNode 的核心业务方法
public void start() throws IOException {
// 第一件事:创建 JournalNode 的本地工作目录
// /home/bigdata/data/journaldata/hadoop330ha
for (File journalDir : localDir) {
validateAndCreateJournalDir(journalDir);
}
// 第二件事: 创建和启动 JournalNode 的 Http 服务,绑定端口 8480
httpServer = new JournalNodeHttpServer(conf, this, getHttpServerBindAddress(conf));
httpServer.start();
// 第三件事: 创建和启动 JournalNode 的 RPC 服务 JournalNodeRpcServer,绑定端口 8485
rpcServer = new JournalNodeRpcServer(conf, this);
rpcServer.start();
}
最重要的需要关注 JournalNodeRpcServer,将来 NameNode 在进行一个事务操作,需要记录日志的时候,会把日志记录到 NameNode 的本地,并发送日志到所
有的 JournalNode,当 NameNode 本地记录成功,并且 JournalNode 中的成功过半,才认为这条事务的日志记录是成功的。
// 1、JournalNodeRpcServer 实现了两个协议:QJournalProtocol 和 InterQJournalProtocol
// 2、QJournalProtocol 是 NameNode 和 JournalNode 之间的通信协议
// 3、InterQJournalProtocol 是 JournalNode 之间进行沟通的协议
public class JournalNodeRpcServer implements QJournalProtocol, InterQJournalProtocol {
// NameNode 发送命令让 JournalNode 开启一个新的日志段 LogSegment
public void startLogSegment(RequestInfo reqInfo, long txid, int layoutVersion){
jn.getOrCreateJournal(....).startLogSegment(reqInfo, txid, layoutVersion);
}
// NameNode 发送 LogEdit 给 JournalNode
public void journal(RequestInfo reqInfo, long segmentTxId, long firstTxnId, int numTxns, byte[] records){
jn.getOrCreateJournal(....).journal(reqInfo, segmentTxId, firstTxnId, numTxns, records);
}
}
ZKFC 核心工作原理和启动源码剖析
关于 ZKFC 的工作流程:
- 建立和 ZK 的链接,创建锁节点的父节点。
- 启动一个监控 NameNode 健康状态的线程。
- 启动 RPCServer,将来可能会出现集群中有两个 standby 但是没有 active,集群重启,手动切换其中一个 namenode 为 active。
hdfs haadmin --transitionToActive nn2
- ZKFC 尝试创建锁节点,参与 active 选举,方式就是通过 基于 zk 的分布式独占锁来执行选举。
- 当选举成功,自己先更新状态,然后通过 RPC 告知 namenode 切换状态。
- 选举不成功,则注册监听,监听 active namenode 的状态。
HDFS NameNode 启动全流程源码剖析
创建和启动 HttpServer
加载磁盘元数据构建 FSNamesystem
FSNamesys