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)

你可能感兴趣的:(HDFS 架构师 1 —NameNode启动流程1)