Hadoop源码分析,namenode是如何启动http服务器对外提供服务的?

分析hadoop源码首先是从启动脚本中寻找调用类

启动脚本路径:
.../hadoop/sbin/start-all.sh

vi star-all.sh 查看脚本内容
# start hdfs daemons if hdfs is present

if [ -f "${HADOOP_HDFS_HOME}"/sbin/start-dfs.sh ]; then

  "${HADOOP_HDFS_HOME}"/sbin/start-dfs.sh --config $HADOOP_CONF_DIR

fi

# start yarn daemons if yarn is present

if [ -f "${HADOOP_YARN_HOME}"/sbin/start-yarn.sh ]; then

  "${HADOOP_YARN_HOME}"/sbin/start-yarn.sh --config $HADOOP_CONF_DIR

fi


从上面脚本内容可以得出,启动hdfs是从sbin目录下的start-dfs.sh脚本启动的,于是查看start-dfs.sh脚本

#---------------------------------------------------------

# namenodes

NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -namenodes)

echo "Starting namenodes on [$NAMENODES]"

"$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \

  --config "$HADOOP_CONF_DIR" \

  --hostnames "$NAMENODES" \

  --script "$bin/hdfs" start namenode $nameStartOpt

#---------------------------------------------------------

于是发现启动namenode是调用了
/sbin/hadoop-daemons.sh +参数,于是转向hadoop-daemons.sh

#################文件内容
bin=`dirname "${BASH_SOURCE-$0}"` 

bin=`cd "$bin"; pwd`

DEFAULT_LIBEXEC_DIR="$bin"/../libexec

HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR}

. $HADOOP_LIBEXEC_DIR/hadoop-config.sh

exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" \; "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@" 
##################

通过查看shell脚本文件发现 原来是调用了sbin/hadoop-daemon.sh  -config  hadoop_conf_dir (配置文件的路径)start

于是寻找sbin/hadoop-daemon.sh 
hadoop_rotate_log $log

    echo starting $command, logging to $log

    cd "$HADOOP_PREFIX"

    case $command in

      namenode|secondarynamenode|datanode|journalnode|dfs|dfsadmin|fsck|balancer|zkfc)

        if [ -z "$HADOOP_HDFS_HOME" ]; then

          hdfsScript="$HADOOP_PREFIX"/bin/hdfs

        else

          hdfsScript="$HADOOP_HDFS_HOME"/bin/hdfs

        fi

        nohup nice -n $HADOOP_NICENESS $hdfsScript --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &

      ;;

      (*)

        nohup nice -n $HADOOP_NICENESS $hadoopScript --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &

      ;;

    esac


通过查看上面脚本可以发现最终转向了bin/hdfs这个脚本,所以去查看hdfs这个脚本
if [ "$COMMAND" = "namenode" ] ; then

  CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'

  # Set SENTRY_HOME if possible and add Sentry plugin jars to classpath

  if [[ -z "$SENTRY_HOME" ]]

  then

    # HADOOP_HDFS_HOME should have been set by hadoop-config.sh

    if [[ -d ${HADOOP_HDFS_HOME}/../sentry ]]

    then

      export SENTRY_HOME=`readlink -m ${HADOOP_HDFS_HOME}/../sentry`

    fi

  fi

  if [[ -n "$SENTRY_HOME" ]]

  then

    for f in ${SENTRY_HOME}/lib/plugins/*.jar; do

    CLASSPATH=${CLASSPATH}:${f}

    done


从上面可以看出原来是启动了org.apache.hadoop.hdfs.server.namenode.NameNode这个类

于是打开IDEA,搜索包路径,进入这个包的main函数路口

前面的if主要是做一些参数的校验,
启动namenode是在
NameNode namenode =createNameNode(argv,null);这一句里

最后返回一个new Namenode(conf)
之后,进入这个类

public NameNode(Configuration conf)throws IOException {

this(conf, NamenodeRole.NAMENODE);

}

/**

* 1、对namenode做参数的注册(fs.defaultFS、rpc地址等)

* 2、初始化

* 3、根据初始化处理的结果,namenode进入对应的状态(active、backup、standby)

* */

protected NameNode(Configuration conf, NamenodeRole role)

throws IOException {

this.conf = conf;

this.role = role;//保存NameNode的角色信息

//设置clients访问nomenode或nameservice的访问地址  配置项fs.defaultFS:hadoop01:9000

  setClientNamenodeAddress(conf);

String nsId = getNameServiceId(conf);

String namenodeId = HAUtil.getNameNodeId(conf, nsId);

//ha相关

  this.haEnabled = HAUtil.isHAEnabled(conf, nsId);

//根据用户设置的启动参数,确定启动以后的初始状态,如果是正常启动,则全部直接进入Standby状态

  state = createHAState(getStartupOption(conf));

this.allowStaleStandbyReads = HAUtil.shouldAllowStandbyReads(conf);

//TODO 在创建HA的时候,也启动了standByNameNode的服务

  this.haContext = createHAContext();

try {

//给联邦模式下准备的,主要是设置联邦模式下namenode的地址和RPC地址

    initializeGenericKeys(conf, nsId, namenodeId);

//TODO

    initialize(conf);

// HA相关

    try {

haContext.writeLock();

state.prepareToEnterState(haContext);

state.enterState(haContext);

}finally {

haContext.writeUnlock();

}

}catch (IOException e) {

this.stop();

throw e;

}catch (HadoopIllegalArgumentException e) {

this.stop();

throw e;

}

this.started.set(true);

}




进入到initialize方法


namenode是如何启动http服务器对外提供服务的

在启动namenode的时候在main函数里进行参数校验,校验完毕之后,根据模式匹配走到defeut,然后进到namenode构造函数,在namenode构造函数当中,会构造一个initialize(conf)这样一个初始化方法,在这个方法中,会对namenode的角色进行判断,如果当前传递过来的角色是namenode的话,此时开始启动http服务,在启动http服务过程中构建了一个NamenodeHttpServer这个类,然后调用这个类的start方法进行启动,在启动过程中主要干的事情是:在当前的http服务里进行绑定服务,也就是setUpServlets这个方法,在这个方法里不断的绑定需要的功能,然后这个start方法就把这个http服务启动完毕了。其实hadoop是通过建造者模式自己构建了一个HttpServer2。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342