티스토리 뷰

개발 노트/Hadoop

hadoop datanode 제거 / 추가 하기 (1)

오리지날초이 2013. 10. 30. 17:29

효율적인 운영을 위해 hadoop cluster 에서 slave server 를 교환하려고 한다.


이를 위해 hadoop 에서는 기존 slave server 를 제거하고 새로운 slave server 를 추가해야 한다.

이때의 작업 절차는 다음과 같다.


1. 기존 slave server 에서 tasktracker 중지

 

2. 기존 slave server 에서 datanode 중지


3. 기존 slave server 의 ip 변경(새 장비가 기존 slave 역할을 대신해야 하므로)


4. 신규 slave server 에서 hadoop config, ip 설정 


5. 신규 slave server 에서 datanode 기동


6. 신규 slave server 에서 tasktracker 기동




slave 에 직접 접속해서 tasktracker, datanode 를 재기동하는 방법은 다음과 같다.


[slave] $hadoop_home/bin/hadoop-daemon.sh stop tasktracker

[slave]$hadoop_home/bin/hadoop-daemon.sh stop datanode


[slave]$hadoop_home/bin/hadoop-daemon.sh start datanode

[slave]$hadoop_home/bin/hadoop-daemon.sh start tasktracker


master 에 접속해서 tasktracker, datanode 를 재기동하는 방법은 다음과 같다.


  1)  기동/종료할 DataNode hostname를 파일에 확인한다.

  2)  대상 서버의 hostname NameNode의 $hadoop_home/conf/tmpfile 에 입력한다.

  3)  tmpfile에 등록된 datanode hadoop을 기동/종료한다.

  

  [master] $hadoop_home/bin/hadoop-daemons.sh --hosts tmpfile stop tasktracker

  [master] $hadoop_home/bin/hadoop-daemons.sh --hosts tmpfile stop datanode


  [master] $hadoop_home/bin/hadoop-daemons.sh --hosts tmpfile start datanode

  [master] $hadoop_home/bin/hadoop-daemons.sh --hosts tmpfile start tasktracker



노드 중단은 tasktracker -> datanode 순으로, 

노드 기동은 datanode -> tasktracker 순으로 한다.


수행 후 전체 hadoop node 에 반영되는 데는 시간이 소요된다.

$hadoop_home/bin/hadoop dfsadmin -refreshNodes 를 수행하여 refresh 적용해주고 약간의 시간을 기다리자.

(5분 정도)


slave 1대를 제거할 때마다 replicated block 이 생긴다.

이것들이 완전히 해소된 것을 확인하고 다음 노드를 제거하자.

 


$hadoop_home/bin/hadoop-daemon.sh 과

$hadoop_home/bin/hadoop-daemons.sh 의 차이


 

[ hadoop-daemons.sh ]

 

# Run a Hadoop command on all slave hosts.

usage="Usage: hadoop-daemons.sh [--config confdir] [--hosts hostlistfile] [start|stop] command args..."

 

# if no args specified, show usage
if [ $# -le 1 ]; then
  echo $usage
  exit 1
fi

 

bin=`dirname "$0"`
bin=`cd "$bin"; pwd`

. $bin/hadoop-config.sh

# hadoop-daemons.sh 위치를 받아서, 동일 위치에서 hadoop-config.sh 을 실행한다.

# hadoop-config.sh 은 $HADOOP_CONF_DIR, $HADOOP_SLAVES 를 export 한다.

 

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

 

# hadoop config 의 slaves 목록을 확인 후 각 slave 에 hadoop-daemon.sh 명령 전달

 

 

[ hadoop-daemon.sh ]

 

# slave 자신에 대해 hadoop-daemon.sh 로 hadoop-command 를 start or stop 한다.

# Run a Hadoop command on all slave hosts.

usage="Usage: hadoop-daemon.sh [--config <conf-dir>] [--hosts hostlistfile] (start|stop) <hadoop-command> <args...>"

 

# if no args specified, show usage
if [ $# -le 1 ]; then
  echo $usage
  exit 1
fi

bin=`dirname "$0"`
bin=`cd "$bin"; pwd`

. "$bin"/hadoop-config.sh

 

# get arguments
startStop=$1
shift
command=$1
shift

hadoop_rotate_log ()
{
    log=$1;
    num=5;
    if [ -n "$2" ]; then
    num=$2
    fi
    if [ -f "$log" ]; then # rotate logs
    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
}

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

 

# get log directory
if [ "$HADOOP_LOG_DIR" = "" ]; then
  export HADOOP_LOG_DIR="$HADOOP_HOME/logs"
fi
mkdir -p "$HADOOP_LOG_DIR"

if [ "$HADOOP_PID_DIR" = "" ]; then
  HADOOP_PID_DIR=/tmp
fi

if [ "$HADOOP_IDENT_STRING" = "" ]; then
  export HADOOP_IDENT_STRING="$USER"
fi

 

# some variables
export HADOOP_LOGFILE=hadoop-$HADOOP_IDENT_STRING-$command-$HOSTNAME.log
export HADOOP_ROOT_LOGGER="INFO,DRFA"
log=$HADOOP_LOG_DIR/hadoop-$HADOOP_IDENT_STRING-$command-$HOSTNAME.out
pid=$HADOOP_PID_DIR/hadoop-$HADOOP_IDENT_STRING-$command.pid

 

# Set default scheduling priority
if [ "$HADOOP_NICENESS" = "" ]; then
    export HADOOP_NICENESS=0
fi

 


case $startStop in

  (start)

    mkdir -p "$HADOOP_PID_DIR"

    if [ -f $pid ]; then
      if kill -0 `cat $pid` > /dev/null 2>&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_HOME"
    fi

    hadoop_rotate_log $log
    echo starting $command, logging to $log
    cd "$HADOOP_HOME"
    nohup nice -n $HADOOP_NICENESS "$HADOOP_HOME"/bin/hadoop --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &
    echo $! > $pid
    sleep 1; head "$log"
    ;;

  (stop)

    if [ -f $pid ]; then
      if kill -0 `cat $pid` > /dev/null 2>&1; then
        echo stopping $command
        kill `cat $pid`
      else
        echo no $command to stop
      fi
    else
      echo no $command to stop
    fi
    ;;

  (*)
    echo $usage
    exit 1
    ;;

esac

 

 

 

 


 



728x90
반응형

'개발 노트 > Hadoop' 카테고리의 다른 글

Hadoop Upgrade Guide for v.0.14  (0) 2013.12.06
Balancer  (0) 2013.12.05
운영상의 이슈  (0) 2013.11.14
hadoop datanode 제거 / 추가 하기 (2)  (0) 2013.11.04
Hadoop Job Error  (1) 2013.10.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함