停止RegionServer服务的大致逻辑

10 篇文章 0 订阅

hbase-daemon.sh中停止RS的脚本如下:

if [ -f $pid ]; then

      # kill -0 == see if the PID exists

      if kill -0 `cat $pid` > /dev/null 2>&1; then //判断进程是否存在

        echo -n stopping $command

        echo "`date` Terminating $command" >> $loglog

        kill `cat $pid` > /dev/null 2>&1  //killRS接受到stop信号,开始处理stop工作

        while kill -0 `cat $pid` > /dev/null 2>&1; do //等待RS进程退出,退出前每隔1秒打印一个”.”

          echo -n "."

          sleep 1;

        done

        rm $pid

        echo

      else

        retval=$?

        echo no $command to stop because kill -0 of pid `cat $pid` failed with status $retval

      fi

    else

      echo no $command to stop because no pid file $pid

    fi

    ;;

 

在启动RS时会使用HRegionServer对象通过Runable.addShutdownHook()方法注册一个jvm退出钩子,当RS进程被非强制kill时会执行HRegionServerstop()方法,在stop()方法中重点是设置valotile变量stopped=true,在HRegionServerrun()方法的while循环中,发现stopped=true则退出循环,执行stop工作,比如:关闭RPC服务,关闭Region,关闭compactsplit等线程池(最长等待60s),从zk中清除对应的节点等工作。

由于RS中很多线程,包括HRegionServer自身就是一个Runable的实现类,这些线程必须确保执行完成,hbase是通过线程的join()方法实现的,当调用join()方法后,会阻塞退出钩子的线程,直到所有线程都执行完成才会完成真正的退出,操作系统才会完成kill

关于jvm的退出钩子在使用时需注意两点:

    1、在设置stop变量后,需通过join()或者一些方式确保当前任务已经执行完

    2、如果线程中有wait() 或者sleep(),则需停止等待或者休眠,避免无谓的时间消耗影响退出速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值