溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hadoop啟動(dòng)腳本分析

發(fā)布時(shí)間:2020-05-22 08:58:53 來源:網(wǎng)絡(luò) 閱讀:11902 作者:wangwei4078 欄目:大數(shù)據(jù)

1 基本概述

Hadoop的命令位于${HADOOP_HOME}/bin、${HADOOP_HOME}/sbin、${HADOOP_HOME}/libexec下面。包含了Linux的shell腳本和windows的批處理文件。本文主要解析linux下的shell腳本。

 

2 腳本詳解

2.1 start-all.sh

要啟動(dòng)Hadoop的各節(jié)點(diǎn)和其他服務(wù),這是一個(gè)繞不開的啟動(dòng)腳本,該腳本位于${HADOOP_HOME}/sbin下。不過在Hadoop的2.x版本中,Hadoop官方已經(jīng)宣布被棄用了。接下來,就詳細(xì)地分析一下該腳本是如何工作的:

1、首先腳本開頭有一段注釋:# Start all hadoop daemons.  Run this on master node.中文意思是:啟動(dòng)所有的進(jìn)程(也就是各節(jié)點(diǎn)),在管理節(jié)點(diǎn)(也就是namenode-名稱節(jié)點(diǎn))上運(yùn)行該腳本。

 

2、如果是2.x版本會(huì)有echo "This script is Deprecated. Instead usestart-dfs.sh and start-yarn.sh"的提示,意思該腳本已經(jīng)過時(shí),該腳本已經(jīng)被start-dfs.sh和 start-yarn.sh替代使用。

 

3、bin=`dirname"${BASH_SOURCE-$0}"`,提取start-all.sh的所在的絕對(duì)路徑。

 

4、bin=`cd"$bin"; pwd`,切換到start-all.sh的所在目錄下,并將路徑賦值給bin。

 

5、DEFAULT_LIBEXEC_DIR="$bin"/../libexec,獲取${HADOOP_HOME}/libexec的絕對(duì)路徑以備后用。

 

6、HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR},為HADOOP_LIBEXEC_DIR變量三元賦值。如果HADOOP_LIBEXEC_DIR為空或者環(huán)境變量沒有配置,就賦值默認(rèn)的絕對(duì)路徑,為下一步執(zhí)行該目錄下面的腳本做準(zhǔn)備。

 

7、.$HADOOP_LIBEXEC_DIR/hadoop-config.sh。執(zhí)行${HADOOP_HOME}/libexec/hadoop-config.sh腳本。為后面執(zhí)行啟動(dòng)各節(jié)點(diǎn)和啟動(dòng)YARN做預(yù)處理。

 

8、執(zhí)行節(jié)點(diǎn)啟動(dòng)腳本

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

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

fi

這段腳本的意圖是:如果${HADOOP_HDFS_HOME}/sbin/start-dfs.sh為文件,則聯(lián)合--config參數(shù)及其后面的參數(shù)值執(zhí)行start-dfs.sh。start-dfs.sh后面做詳細(xì)分析。

另外看注釋:# start hdfsdaemons if hdfs is present,中文意思是:啟動(dòng)hdfs進(jìn)程

 

9、執(zhí)行YRAN調(diào)度服務(wù)

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

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

fi

這段腳本的意圖是:如果${HADOOP_HDFS_HOME}/sbin/start-yarn.sh為文件,則聯(lián)合--config參數(shù)及其后面的參數(shù)值執(zhí)行start-yarn.sh。start-yarn.sh后面做詳細(xì)分析。

  另外看注釋:# start yarndaemons if yarn is present,中文意思是:啟動(dòng)yarn進(jìn)程。

 

備注${HADOOP_HDFS_HOME}已經(jīng)在hadoop-config.sh做了預(yù)處理。hadoop-config.sh后面做詳細(xì)的分析。

 

2.2 hadoop-config.sh

該腳本位于${HADOOP_HOME}/libexec下。該腳本是在啟動(dòng)節(jié)點(diǎn)和其他服務(wù)之前必須要執(zhí)行的一個(gè)腳本。它的主要目的使用啟動(dòng)Hadoop之前做一些環(huán)境變量預(yù)處理。接下來,就詳細(xì)地分析一下該腳本是如何工作的:

      1、文件最前面的注釋:Resolvelinks ($0 may be a softlink) and convert a relative path to an absolute path。中文意思是:解析路徑并將一些相對(duì)路徑轉(zhuǎn)成絕對(duì)路徑。

 

      2、執(zhí)行hadoop-layout.sh腳本

this="${BASH_SOURCE-$0}"

common_bin=$(cd-P -- "$(dirname -- "$this")" && pwd -P)

script="$(basename-- "$this")"

this="$common_bin/$script"

[ -f"$common_bin/hadoop-layout.sh" ] && ."$common_bin/hadoop-layout.sh"

      這段腳本的意圖就是找出hadoop-layout.sh并執(zhí)行,如果沒有找出來就不執(zhí)行。同時(shí)有些變量為后面的程序執(zhí)行做準(zhǔn)備。

 

      3、準(zhǔn)備HDFS、YRAN、Mapreduce的jar包路徑并設(shè)置路徑

HADOOP_COMMON_DIR=${HADOOP_COMMON_DIR:-"share/hadoop/common"}

HADOOP_COMMON_LIB_JARS_DIR=${HADOOP_COMMON_LIB_JARS_DIR:-"share/hadoop/common/lib"}

HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_COMMON_LIB_NATIVE_DIR:-"lib/native"}

HDFS_DIR=${HDFS_DIR:-"share/hadoop/hdfs"}

HDFS_LIB_JARS_DIR=${HDFS_LIB_JARS_DIR:-"share/hadoop/hdfs/lib"}

YARN_DIR=${YARN_DIR:-"share/hadoop/yarn"}

YARN_LIB_JARS_DIR=${YARN_LIB_JARS_DIR:-"share/hadoop/yarn/lib"}

MAPRED_DIR=${MAPRED_DIR:-"share/hadoop/mapreduce"}

MAPRED_LIB_JARS_DIR=${MAPRED_LIB_JARS_DIR:-"share/hadoop/mapreduce/lib"}

     

      4、設(shè)置${Hadoop_Home}的根目錄的環(huán)境變量

      HADOOP_DEFAULT_PREFIX=$(cd -P --"$common_bin"/.. && pwd -P)

HADOOP_PREFIX=${HADOOP_PREFIX:-$HADOOP_DEFAULT_PREFIX}

export HADOOP_PREFIX

 

5、判斷輸出參數(shù)

if [ $# -gt 1 ]

then

    if ["--config" = "$1" ]

     then

         shift

         confdir=$1

         if [ ! -d "$confdir" ]; then

               echo "Error: Cannot find configuration directory: $confdir"

               exit 1

             fi

         shift

         HADOOP_CONF_DIR=$confdir

    fi

fi

 

這段代碼參數(shù)的意思:$#是表示輸入的參數(shù)個(gè)數(shù),如果個(gè)數(shù)大于1,則判斷—config后面的參數(shù)是否是一個(gè)目錄。如果不是,則退出執(zhí)行,如果是將傳入的參數(shù)賦值給HADOOP_CONF_DIR變量,即將HADOOP_CONF_DIR變量定位到hadoop的配置目錄。

     

6、設(shè)置hadoop的日志級(jí)別

if [ $# -gt 1 ]

then

  if [ "--loglevel" = "$1"]

  then

    shift

    HADOOP_LOGLEVEL=$1

    shift

  fi

fi

HADOOP_LOGLEVEL="${HADOOP_LOGLEVEL:-INFO}"

      這段代碼的意思是:如果沒有傳入日志參數(shù),則默認(rèn)為INFO級(jí)別。

 

      7、設(shè)置HADOOP_CONF_DIR配置的環(huán)境變量,也是啟動(dòng)Hadoop的工作目錄(--config后面的參數(shù)值)

if [ -e"${HADOOP_PREFIX}/conf/hadoop-env.sh" ]; then

  DEFAULT_CONF_DIR="conf"

else

  DEFAULT_CONF_DIR="etc/hadoop"

fi

 

exportHADOOP_CONF_DIR="${HADOOP_CONF_DIR:-$HADOOP_PREFIX/$DEFAULT_CONF_DIR}"

      這段的代碼的意圖是:如果參數(shù)值存在,輸出傳入的參數(shù)值;如果不存在,使用默認(rèn)的目錄,一般位于${HADOOP_HOME}/etc/Hadoop.

 

      8、設(shè)置部署各個(gè)節(jié)點(diǎn)hostname配置的環(huán)境變量

if [ $# -gt 1 ]

then

    if [ "--hosts" = "$1" ]

    then

        shift

        exportHADOOP_SLAVES="${HADOOP_CONF_DIR}/$1"

        shift

    elif [ "--hostnames" ="$1" ]

    then

        shift

        export HADOOP_SLAVE_NAMES=$1

        shift

    fi

fi

      這段代碼:讀取${HADOOP_HOME}/${HADOOP_CONF_DIR}/slaves文件里面的主機(jī)配置列表并輸出HADOOP_SLAVES或者HADOOP_SLAVE_NAMES環(huán)境變量。

 

      9、設(shè)置hadoop運(yùn)行的其他環(huán)境變量

      類似于上面:如果在操作系統(tǒng)的設(shè)置過環(huán)境變量,則直接使用。如果沒有設(shè)置,則設(shè)置成默認(rèn)的環(huán)境變量。這些環(huán)境變量有:JAVA_HOME、CLASSPATH、JVM啟動(dòng)參數(shù)、JAVA_LIBRARY_PATH、MALLOC_ARENA_MAX等,這里不再一一贅述。如果有不懂的地方,自行查詢java的相關(guān)環(huán)境變量配置資料

同時(shí)還設(shè)置了以下的環(huán)境變量:HADOOP_HOME、HADOOP_OPTS、HADOOP_COMMON_HOME、TOOL_PATH、HADOOP_HDFS_HOME、LD_LIBRARY_PATH、HADOOP_YARN_HOME、HADOOP_MAPRED_HOME。這些環(huán)境變量的設(shè)置都引用了前面的變量,這里也不再一一贅述。


  2.3 start-hdfs.sh

該腳本位于${HADOOP_HOME}/sbin下。該腳本是啟動(dòng)集群各節(jié)點(diǎn)(包括名稱主節(jié)點(diǎn)、各個(gè)名稱從節(jié)點(diǎn)、各個(gè)數(shù)據(jù)節(jié)點(diǎn))的一個(gè)腳本。接下來,就詳細(xì)地分析一下該腳本是如何工作的:

      1、文件最前面的注釋:Starthadoop dfs daemons。中文意思是:啟動(dòng)dfs的各個(gè)進(jìn)程。

 

      2、提示信息變量:usage="Usage:start-dfs.sh [-upgrade|-rollback] [other options such as -clusterId]"。提示在執(zhí)行這個(gè)腳本的時(shí)候需要主要哪些東西的一個(gè)提示信息。

 

      3、執(zhí)行預(yù)處理腳本,這個(gè)腳本在前面已經(jīng)分析過了,不再贅述。

      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/hdfs-config.sh

則也就是不推薦使用的start-all.sh這個(gè)腳本的原因所在。

 

      4、根據(jù)傳入?yún)?shù)進(jìn)行判斷進(jìn)行相應(yīng)的變量設(shè)置

if [[ $# -ge 1]]; then

  startOpt="$1"

  shift

  case "$startOpt" in

    -upgrade)

      nameStartOpt="$startOpt"

    ;;

    -rollback)

      dataStartOpt="$startOpt"

    ;;

    *)

      echo $usage

      exit 1

    ;;

  esac

fi

      這段代碼的意思是:如果參數(shù)值的個(gè)數(shù)大于等于1的時(shí)候,如果參數(shù)是upgrade,則設(shè)置nameStartOpt變量以備后用;如果是rollback,則設(shè)置dataStartOpt變量以備后用。

 

      5、添加名稱節(jié)點(diǎn)可能參數(shù)值

      nameStartOpt="$nameStartOpt$@"

     

      6、啟動(dòng)管理(主)名稱節(jié)點(diǎn)

NAMENODES=$($HADOOP_PREFIX/bin/hdfsgetconf -namenodes)

echo"Starting namenodes on [$NAMENODES]"

 

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

  --config"$HADOOP_CONF_DIR" \

  --hostnames"$NAMENODES" \

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

      這段的意思是:將config、hostnames、script的參數(shù)值傳給hadoop-daemons.sh執(zhí)行,啟動(dòng)名稱主節(jié)點(diǎn)。實(shí)際上是通過hdfs命令啟動(dòng)的。

$($HADOOP_PREFIX/bin/hdfs getconf -namenodes)是在提取主名稱節(jié)點(diǎn)的主機(jī)名。

--script "$bin/hdfs" startnamenode $nameStartOpt實(shí)際啟動(dòng)名稱節(jié)點(diǎn)。

      hadoop-daemons.sh腳本后面在做詳細(xì)分析。

     

      7、啟動(dòng)數(shù)據(jù)節(jié)點(diǎn)

if [ -n"$HADOOP_SECURE_DN_USER" ]; then

  echo \

    "Attempting to start secure cluster,skipping datanodes. " \

    "Run start-secure-dns.sh as root tocomplete startup."

else

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

    --config "$HADOOP_CONF_DIR" \

    --script "$bin/hdfs" startdatanode $dataStartOpt

fi

 

這段的意思是:將config、script的參數(shù)值傳給hadoop-daemons.sh執(zhí)行,啟動(dòng)數(shù)據(jù)節(jié)點(diǎn)節(jié)點(diǎn)。實(shí)際上也是通過hdfs命令啟動(dòng)的。

if [ -n "$HADOOP_SECURE_DN_USER"]; then這段代碼可以忽略,基本不用。

--script "$bin/hdfs" startdatanode $dataStartOpt實(shí)際啟動(dòng)名稱節(jié)點(diǎn)。

 

      8、啟動(dòng)從名稱節(jié)點(diǎn)

SECONDARY_NAMENODES=$($HADOOP_PREFIX/bin/hdfsgetconf -secondarynamenodes 2>/dev/null)

if [ -n"$SECONDARY_NAMENODES" ]; then

  echo "Starting secondary namenodes[$SECONDARY_NAMENODES]"

 

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

      --config "$HADOOP_CONF_DIR" \

      --hostnames"$SECONDARY_NAMENODES" \

      --script "$bin/hdfs" startsecondarynamenode

Fi

      這段的意思是:將config、hostnames、script的參數(shù)值傳給hadoop-daemons.sh執(zhí)行,啟動(dòng)名稱主節(jié)點(diǎn)。實(shí)際上是通過hdfs命令啟動(dòng)的。

SECONDARY_NAMENODES=$($HADOOP_PREFIX/bin/hdfsgetconf -secondarynamenodes 2>/dev/null),是在提取從名稱節(jié)點(diǎn)的主機(jī)名。

 

--script "$bin/hdfs" start namenode secondarynamenode實(shí)際啟動(dòng)名稱節(jié)點(diǎn)。

 

      9、后面的執(zhí)行

      后面的執(zhí)行過程,后面有時(shí)間一一補(bǔ)充。

 

  2.4 hadoop-daemons.sh

該腳本位于${HADOOP_HOME}/sbin下。該腳本是具體執(zhí)行啟動(dòng)集群各節(jié)點(diǎn)(包括名稱主節(jié)點(diǎn)、各個(gè)名稱從節(jié)點(diǎn)、各個(gè)數(shù)據(jù)節(jié)點(diǎn))的一個(gè)腳本。接下來,就詳細(xì)地分析一下該腳本是如何工作的:

1、其它的代碼可以不做重點(diǎn)關(guān)注

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

      拆解這段代碼:

A、先執(zhí)行slaves.sh腳本,這個(gè)腳本是根據(jù)slaves的主機(jī)列表迭代執(zhí)行hadoop-daemon.sh腳本。

B、然后將所有參數(shù)傳入并執(zhí)行hadoop-daemon.sh腳本。

 

   2.5 hadoop-daemon.sh

        該腳本位于${HADOOP_HOME}/sbin下。該腳本是具體執(zhí)行啟動(dòng)集群各節(jié)點(diǎn)(包括名稱主節(jié)點(diǎn)、各個(gè)名稱從節(jié)點(diǎn)、各個(gè)數(shù)據(jù)節(jié)點(diǎn))的一個(gè)腳本。接下來,就詳細(xì)地分析一下該腳本是如何工作的:

      1、先調(diào)用hadoop-config.sh腳本,不再贅述。

 

      2、提取hadoop命令并設(shè)置變量:

            hadoopScript="$HADOOP_PREFIX"/bin/Hadoop

 

      3、提取命令(或是啟動(dòng)命令,或是停止命令),提取節(jié)點(diǎn)(或者名稱節(jié)點(diǎn),或是數(shù)據(jù)節(jié)點(diǎn))

        hadoopScript="$HADOOP_PREFIX"/bin/hadoop

        if[ "--script" = "$1" ]

          then

            shift

            hadoopScript=$1

            shift

        fi

        startStop=$1

        shift

        command=$1

        shift

 

      4、輸出日志相關(guān)

        hadoop_rotate_log()

        {

            log=$1;

            num=5;

            if [ -n "$2" ]; then

              num=$2

            fi

            if [ -f "$log" ]; then # rotatelogs

              while [ $num -gt 1 ]; do

                 prev=`expr $num - 1`

                 [ -f "$log.$prev" ] && mv "$log.$prev""$log.$num"

                 num=$prev

              done

              mv "$log" "$log.$num";

            fi

        }

 

      5、執(zhí)行環(huán)境變量設(shè)置腳本

        if[ -f "${HADOOP_CONF_DIR}/hadoop-env.sh" ]; then

          ."${HADOOP_CONF_DIR}/hadoop-env.sh"

        fi

 

      6、根據(jù)啟動(dòng)節(jié)點(diǎn)的不同重新設(shè)置不同的變量值

        #Determine if we're starting a secure datanode, and if so, redefine appropriatevariables

        if[ "$command" == "datanode" ] && [ "$EUID"-eq 0 ] && [ -n "$HADOOP_SECURE_DN_USER" ]; then

          exportHADOOP_PID_DIR=$HADOOP_SECURE_DN_PID_DIR

          exportHADOOP_LOG_DIR=$HADOOP_SECURE_DN_LOG_DIR

          exportHADOOP_IDENT_STRING=$HADOOP_SECURE_DN_USER

          starting_secure_dn="true"

        fi

         

        #Determineif we're starting a privileged NFS, if so, redefine the appropriate variables

        if[ "$command" == "nfs3" ] && [ "$EUID" -eq0 ] && [ -n "$HADOOP_PRIVILEGED_NFS_USER" ]; then

            exportHADOOP_PID_DIR=$HADOOP_PRIVILEGED_NFS_PID_DIR

            exportHADOOP_LOG_DIR=$HADOOP_PRIVILEGED_NFS_LOG_DIR

            exportHADOOP_IDENT_STRING=$HADOOP_PRIVILEGED_NFS_USER

            starting_privileged_nfs="true"

        fi

 

      7、中間的都是輸出日志和設(shè)置其他臨時(shí)變量和環(huán)境變量,不做重點(diǎn)介紹,請(qǐng)自行參考腳本

     

8、啟動(dòng)或者停止節(jié)點(diǎn)

case$startStop in

 

  (start)

 

    [ -w "$HADOOP_PID_DIR" ] ||  mkdir -p "$HADOOP_PID_DIR"

 

    if [ -f $pid ]; then

      if kill -0 `cat $pid` > /dev/null2>&1; then

        echo $command running as process `cat$pid`.  Stop it first.

        exit 1

      fi

    fi

 

    if [ "$HADOOP_MASTER" !="" ]; then

      echo rsync from $HADOOP_MASTER

      rsync -a -e ssh --delete --exclude=.svn--exclude='logs/*' --exclude='contrib/hod/logs/*' $HADOOP_MASTER/"$HADOOP_PREFIX"

    fi

 

    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

    echo $! > $pid

    sleep 1

    head "$log"

    # capture the ulimit output

    if [ "true" ="$starting_secure_dn" ]; then

      echo "ulimit -a for secure datanodeuser $HADOOP_SECURE_DN_USER" >> $log

      # capture the ulimit info for theappropriate user

      su --shell=/bin/bash$HADOOP_SECURE_DN_USER -c 'ulimit -a' >> $log 2>&1

    elif [ "true" ="$starting_privileged_nfs" ]; then

        echo "ulimit -a for privileged nfsuser $HADOOP_PRIVILEGED_NFS_USER" >> $log

        su --shell=/bin/bash $HADOOP_PRIVILEGED_NFS_USER-c 'ulimit -a' >> $log 2>&1

    else

      echo "ulimit -a for user $USER">> $log

      ulimit -a >> $log 2>&1

    fi

    sleep 3;

    if ! ps -p $! > /dev/null ; then

      exit 1

    fi

    ;;

         

  (stop)

 

    if [ -f $pid ]; then

      TARGET_PID=`cat $pid`

      if kill -0 $TARGET_PID > /dev/null2>&1; then

        echo stopping $command

        kill $TARGET_PID

        sleep $HADOOP_STOP_TIMEOUT

        if kill -0 $TARGET_PID > /dev/null2>&1; then

          echo "$command did not stopgracefully after $HADOOP_STOP_TIMEOUT seconds: killing with kill -9"

          kill -9 $TARGET_PID

        fi

      else

        echo no $command to stop

      fi

      rm -f $pid

    else

      echo no $command to stop

    fi

    ;;

 

  (*)

    echo$usage

    exit 1

    ;;

 

esac

 

      這是一個(gè)分支執(zhí)行流程,分為啟動(dòng)節(jié)點(diǎn)和停止節(jié)點(diǎn):

            A、啟動(dòng)節(jié)點(diǎn)分支:在該分支下,首先判斷節(jié)點(diǎn)主機(jī)上的PID(其實(shí)就是默認(rèn)設(shè)置的端口)是否被占用,如果被占用則停止啟動(dòng)。如果沒有被占用,則開始打印日志,也是我們?cè)诳刂婆_(tái)上看到的日志(echo starting $command, logging to $log)。表明開始啟動(dòng)節(jié)點(diǎn)上的hadoop進(jìn)程,然后根據(jù)$command變量判斷啟動(dòng)哪個(gè)節(jié)點(diǎn),最后將所有的參數(shù)傳入hdfs命令啟動(dòng)節(jié)點(diǎn),至此,該節(jié)點(diǎn)就啟動(dòng)起來了。

            B、停止節(jié)點(diǎn)分支:在該分支下,首先判斷節(jié)點(diǎn)主機(jī)上的PID(其實(shí)就是默認(rèn)設(shè)置的端口)是否被占用,如果被占用則殺掉進(jìn)程,如果沒有被殺掉,則使用kill-9強(qiáng)制殺掉。如果PID沒有被占用,則會(huì)打印提示信息:“沒有XX節(jié)點(diǎn)需要停止”, 至此,該節(jié)點(diǎn)就停止服務(wù)了。

 

 2.6 hdfs

      該腳本首先判斷是否有參數(shù)傳入或者參數(shù)是否正確,如果沒有參數(shù)或者參數(shù)錯(cuò)誤,就會(huì)提示用戶需要傳遞參數(shù)或者傳遞正確的參數(shù)。

      然后根據(jù)參數(shù)值判斷后調(diào)用jdk(JAVA_HOME)下相應(yīng)的腳本,最后啟動(dòng)相應(yīng)的java進(jìn)程。

      總而言之,這個(gè)腳本才是啟動(dòng)hadoop的最終歸宿,如果能掌握hadoop里面的所有入口函數(shù),也可以認(rèn)為這個(gè)腳本也不是最終歸宿,因?yàn)檫@個(gè)腳本的最終目的就是通過調(diào)用jdk下面的java命令啟動(dòng)Hadoop的必要入口函數(shù),也就是main方法,最終達(dá)到啟動(dòng)整個(gè)Hadoop集群的目的。

 

 2.7 start-yarn.sh

      該腳本的執(zhí)行流程與start-hdfs的執(zhí)行流程類似,請(qǐng)自行參考該shell腳本,這里不再贅述。

 

 2.8 yarn-daemons.sh

      該腳本的執(zhí)行流程與hadoop-daemons.sh的執(zhí)行流程類似,請(qǐng)自行參考該shell腳本,這里不再贅述。

 

 2.9 yarn-daemon.sh

      該腳本的執(zhí)行流程與hadoop-daemon.sh的執(zhí)行流程類似,請(qǐng)自行參考該shell腳本,這里不再贅述。

     

 2.10 各停止腳本

      從上面hadoop-daemon.sh可以看出,停止各節(jié)點(diǎn)的服務(wù),無外乎也就是先提取相應(yīng)的環(huán)境變量,然后殺掉相應(yīng)的進(jìn)程,將占用端口釋放出來,沒什么大書特書的。如有興趣,可以自行研究停止腳本,這里不再做詳細(xì)分析。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI