HDFS 架构师 1 —NameNode启动流程1
0、NameNode 承受高流量的机制
双缓冲写入editlog
editlog.png双缓冲.png
1、 NameNode流程启动剖析 ) 0:48
image.png本节目的 : 验证namenode是不是rpcserver
1.1 shell 启动脚本部分:
\hadoop-2.7.0-src\hadoop-hdfs-project\hadoop-hdfs\src\main\bin\start-dfs.sh
——》
$HADOOP_PREFIX/sbin/hadoop-daemons.sh \
--config "$HADOOP_CONF_DIR" \
--hostnames "$NAMENODES" \
--script "$bin/hdfs" start namenode $nameStartOpt
——》
\hadoop-2.7.0-src\hadoop-common-project\hadoop-common\src\main\bin\hadoop-daemons.sh
exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" \; "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@"
——》
\hadoop-2.7.0-src\hadoop-common-project\hadoop-common\src\main\bin\hadoop-daemon.sh
▼
hdfsScript="$HADOOP_HDFS_HOME"/bin/hdfs
——》
\hadoop-2.7.0-src\hadoop-hdfs-project\hadoop-hdfs\src\main\bin\hdfs
▼
if [ "$COMMAND" = "namenode" ] ; then
CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"
........
exec $JAVA -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
现在进入java 部分主类:
org.apache.hadoop.hdfs.server.namenode.NameNode
1.2 NameNode类启动流程
入口 main() 方法
▼
//TODO 创建NameNode的核心代码
NameNode namenode = createNameNode(argv, null);
——》NameNode #createNameNode()
▼
default: {
DefaultMetricsSystem.initialize("NameNode");
//因为我们现在分析的是启动namenode的代码,所以代码肯定是走到这儿了。
//TODO 关键代码
return new NameNode(conf);
——》NameNode #构造函数()
——1 》NameNode # initialize
▼
/**
* namenode的启动流程
* 服务端:
* RPCServer
* 9000/8020
* HttpServer
* 50070
*/
if (NamenodeRole.NAMENODE == role) {
//TODO 启动HTTPServer
startHttpServer(conf); // 行号 1》
}
——1.1 》NameNode #startHttpServer()
▼
//TODO getHttpServerBindAddress 里面设置了主机名和端口号
httpServer = new NameNodeHttpServer(conf, this,
//TODO 绑定一堆servlet
//servlet越多,支持的功能就越多
setupServlets(httpServer, conf);
—— 1.1.1 》NameNodeHttpServer#setupServlets()
▼
//TODO 上传元数据的请求
//SecondaryNameNode/StandByNamenode合并出来的FSImage需要替换Active NameNode的fsimage
//发送的就是http的请求,请求就会转发给这个servlet
httpServer.addInternalServlet("imagetransfer",
//TODO 我们可以在50070界面上浏览目录信息,就是因为这儿有这个servlet
// http://hadoop1:50070/listpahts/?path=/usr
httpServer.addInternalServlet("listPaths",
-------▲回到 行号 1》处--------
//TODO 加载元数据
//加载元数据这个事,目前对集群刚启动的时候,我们不做重点分析。
//在后面分析到管理元数据的时候,我们会回过头来在分析。
//为什么现在不分析?
//根据场景驱动,集群刚初始化启动,所以其实没什么元数据。
loadNamesystem(conf);
//TODO 重要,这个就是Hadoop RPC
//NameNodeRPCserver里面有两个主要的RPC服务:
//1)ClientRPCServer: 主要管理的协议是:hdfs的客户端(用户)去操作HDFS的方法
//2)ServiceRPCServer: 主要管理的协议:服务之间互相进行的方法的调用(注册,心跳等)
rpcServer = createRpcServer(conf);
——1.2 》NameNodeRpcServer构造函数
▼
//客户端调用namenode的那些方法,都在这个协议里面。
ClientNamenodeProtocolServerSideTranslatorPB
clientProtocolServerTranslator =
//datanode之间需要互相调用的协议。
DatanodeProtocolServerSideTranslatorPB dnProtoPbTranslator =
new DatanodeProtocolServerSideTranslatorPB(this);
//namenode之间互相调用的协议
NamenodeProtocolServerSideTranslatorPB namenodeProtocolXlator =
new NamenodeProtocolServerSideTranslatorPB(this);
// JPS namenode服务
this.serviceRpcServer = new RPC.Builder(conf)
//TODO 启动了clietnRpcServer
//这个服务是主要服务于 用户使用的客户端发送过来的请求的
this.clientRpcServer = new RPC.Builder(conf)