Hadoop相关启动脚本分析(2)

Hadoop-daemon.shlog rotate,看得出日志的流动方向么? 新 1->2->3->4->5 旧

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   }  

# Determine if we're starting a secure datanode, and if so, redefine appropriate variables   if [ "$command" == "datanode" ] && [ "$EUID" -eq 0 ] && [ -n "$HADOOP_SECURE_DN_USER" ]; then  

至于$EUID是系统变量。在hadoop还用到IFS变量。

nohup nice -n $HADOOP_NICENESS "$HADOOP_HOME"/bin/hadoop --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &      echo $! > $pid  

nohup 是个好东西,ssh登录上主机,如果连接断了,当前执行的命令也会挂掉(sighup),有兴趣自己再去google。

nice用来调优先级,没用过。

最终还是通过hadoop来执行程序。

hadoop-daemons.sh

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

惊恐

cd "$HADOOP_HOME" \; 似乎没啥用。。。暂时没发现有关联pwd的配置

实际调用了slaves.sh,"$bin/hadoop-daemon.sh" 也传了过去。

这里能解开我之前的一个疑惑:master怎么知道slaves的的hadoop安装在哪。"$bin/hadoop-daemon.sh" 这坑爹的路径是master的,也就是说,各个机器的hadoop目录要一致。hadoop-daemon.sh 里面可以rsync from $HADOOP_MASTER

slaves.sh

if [ "$HOSTLIST" = "" ]; then     if [ "$HADOOP_SLAVES" = "" ]; then       export HOSTLIST="${HADOOP_CONF_DIR}/slaves"     else       export HOSTLIST="${HADOOP_SLAVES}"     fi   fi      for slave in `cat "$HOSTLIST"|sed  "s/#.*$//;/^$/d"`; do    ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \      2>&1 | sed "s/^/$slave: /" &    if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then      sleep $HADOOP_SLAVE_SLEEP    fi   done  

一般我们都用slaves文件来配置slaves机器。

sed  "s/#.*$//;/^$/d"`;  

根据正则表达式的经验,看来是去掉#注释行和空行。

$"${@// /\\ }"   

$@ = $1 $2 ...

${@// /\\ }为带有空格的参数加上空格转义。

$"..."  本土化?不知有啥意义,不都是英文么?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/d3a934dd1e4f10285cb1be70ac17668c.html