设为首页 收藏本站
查看: 879|回复: 0

[经验分享] Hadoop启动脚本解析

[复制链接]

尚未签到

发表于 2018-10-31 13:14:47 | 显示全部楼层 |阅读模式
  在工作过程中,经常需要调整一些hadoop的参数配置,所以经常会遇到各种各样的问题。比如改了个配置怎么突然namenode起不来啦,加了个jar包怎么让hadoop的jvm加载啊,如何设定log目录啦等等,每次都需要仔细的查一遍启动脚本才能找到原因,费时又费力,因此专门总结了一下以便不时之需。
  cloudera的hadoop的启动脚本写的异常复杂和零散,各种shell脚本分散在系统的各个角落,让人很无语。下面以namenode启动的过程为例说明hadoop的启动脚本的调用关系和各个脚本的作用。
  hadoop启动的入口脚本是/etc/init.d/hadoop-hdfs-name,下面我们顺着启动namenode的顺序看看hadoop的启动调用过程。
  /etc/init.d/hadoop-hdfs-namenode:
  #1.加载/etc/default/hadoop /etc/default/hadoop-hdfs-namenode
  #2.执行/usr/lib/hadoop/sbin/hadoop-daemon.sh启动namenode
  cloudera启动namenode的用户为hdfs,默认的配置目录是/etc/hadoop/conf
  start() {
  [ -x $EXEC_PATH ] || exit $ERROR_PROGRAM_NOT_INSTALLED
  [ -d $CONF_DIR ] || exit $ERROR_PROGRAM_NOT_CONFIGURED
  log_success_msg "Starting ${DESC}: "
  su -s /bin/bash $SVC_USER -c "$EXEC_PATH --config '$CONF_DIR' start $DAEMON_FLAGS"
  # Some processes are slow to start
  sleep $SLEEP_TIME
  checkstatusofproc
  RETVAL=$?
  [ $RETVAL -eq $RETVAL_SUCCESS ] && touch $LOCKFILE
  return $RETVAL
  }
  /etc/default/hadoop  /etc/default/hadoop-hdfs-namenode:
  #1.配置logdir,piddir,user
  /usr/lib/hadoop/sbin/hadoop-daemon.sh
  #1.加载/usr/lib/hadoop/libexec/hadoop-config.sh
  DEFAULT_LIBEXEC_DIR="$bin"/../libexec
  HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR}
  . $HADOOP_LIBEXEC_DIR/hadoop-config.sh
  #2.加载hadoop-env.sh
  if [ -f "${HADOOP_CONF_DIR}/hadoop-env.sh" ]; then
  . "${HADOOP_CONF_DIR}/hadoop-env.sh"
  fi
  #3.指定log目录
  # get log directory
  if [ "$HADOOP_LOG_DIR" = "" ]; then
  export HADOOP_LOG_DIR="$HADOOP_PREFIX/logs"
  fi
  #4.补全log目录和log4j的logger等参数
  export HADOOP_LOGFILE=hadoop-$HADOOP_IDENT_STRING-$command-$HOSTNAME.log
  export HADOOP_ROOT_LOGGER=${HADOOP_ROOT_LOGGER:-"INFO,RFA"}
  export HADOOP_SECURITY_LOGGER=${HADOOP_SECURITY_LOGGER:-"INFO,RFAS"}
  export HDFS_AUDIT_LOGGER=${HDFS_AUDIT_LOGGER:-"INFO,NullAppender"}
  log=$HADOOP_LOG_DIR/hadoop-$HADOOP_IDENT_STRING-$command-$HOSTNAME.out
  pid=$HADOOP_PID_DIR/hadoop-$HADOOP_IDENT_STRING-$command.pid
  HADOOP_STOP_TIMEOUT=${HADOOP_STOP_TIMEOUT:-5}
  #5.调用/usr/lib/hadoop-hdfs/bin/hdfs
  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 &quot;$@&quot; > &quot;$log&quot; 2>&1 < /dev/null &
  ;;
  (*)
  nohup nice -n $HADOOP_NICENESS $hadoopScript --config $HADOOP_CONF_DIR $command &quot;$@&quot; > &quot;$log&quot; 2>&1 < /dev/null &
  ;;
  esac
  echo $! > $pid
  sleep 1; head &quot;$log&quot;
  sleep 3;
  if ! ps -p $! > /dev/null ; then
  exit 1
  fi
  可以看到namenode的sysout输出到$log中,即log=$HADOOP_LOG_DIR/hadoop-$HADOOP_IDENT_STRING-$command-$HOSTNAME.out
  /usr/lib/hadoop/libexec/hadoop-config.sh
  #1.加载/usr/lib/hadoop/libexec/hadoop-layout.sh
  hadoop-layout.sh主要描述了hadoop的lib的文件夹结构,主要内容如下
  HADOOP_COMMON_DIR=&quot;./&quot;
  HADOOP_COMMON_LIB_JARS_DIR=&quot;lib&quot;
  HADOOP_COMMON_LIB_NATIVE_DIR=&quot;lib/native&quot;
  HDFS_DIR=&quot;./&quot;
  HDFS_LIB_JARS_DIR=&quot;lib&quot;
  YARN_DIR=&quot;./&quot;
  YARN_LIB_JARS_DIR=&quot;lib&quot;
  MAPRED_DIR=&quot;./&quot;
  MAPRED_LIB_JARS_DIR=&quot;lib&quot;
  HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-&quot;/usr/lib/hadoop/libexec&quot;}
  HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-&quot;/etc/hadoop/conf&quot;}
  HADOOP_COMMON_HOME=${HADOOP_COMMON_HOME:-&quot;/usr/lib/hadoop&quot;}
  HADOOP_HDFS_HOME=${HADOOP_HDFS_HOME:-&quot;/usr/lib/hadoop-hdfs&quot;}
  HADOOP_MAPRED_HOME=${HADOOP_MAPRED_HOME:-&quot;/usr/lib/hadoop-0.20-mapreduce&quot;}
  YARN_HOME=${YARN_HOME:-&quot;/usr/lib/hadoop-yarn&quot;}
  #2.指定HDFS和YARN的lib
  HADOOP_COMMON_DIR=${HADOOP_COMMON_DIR:-&quot;share/hadoop/common&quot;}
  HADOOP_COMMON_LIB_JARS_DIR=${HADOOP_COMMON_LIB_JARS_DIR:-&quot;share/hadoop/common/lib&quot;}
  HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_COMMON_LIB_NATIVE_DIR:-&quot;lib/native&quot;}
  HDFS_DIR=${HDFS_DIR:-&quot;share/hadoop/hdfs&quot;}
  HDFS_LIB_JARS_DIR=${HDFS_LIB_JARS_DIR:-&quot;share/hadoop/hdfs/lib&quot;}
  YARN_DIR=${YARN_DIR:-&quot;share/hadoop/yarn&quot;}
  YARN_LIB_JARS_DIR=${YARN_LIB_JARS_DIR:-&quot;share/hadoop/yarn/lib&quot;}
  MAPRED_DIR=${MAPRED_DIR:-&quot;share/hadoop/mapreduce&quot;}
  MAPRED_LIB_JARS_DIR=${MAPRED_LIB_JARS_DIR:-&quot;share/hadoop/mapreduce/lib&quot;}
  # the root of the Hadoop installation
  # See HADOOP-6255 for directory structure layout
  HADOOP_DEFAULT_PREFIX=$(cd -P -- &quot;$common_bin&quot;/.. && pwd -P)
  HADOOP_PREFIX=${HADOOP_PREFIX:-$HADOOP_DEFAULT_PREFIX}
  export HADOOP_PREFIX
  #3.对slave文件判断。但cdh的hadoop不是依靠slave来启动集群的,而是要用户自己写集群启动脚本(也许是为了逼用户用他的CloudManager。。。)
  #4.再次指定env文件
  if [ -f &quot;${HADOOP_CONF_DIR}/hadoop-env.sh&quot; ]; then
  . &quot;${HADOOP_CONF_DIR}/hadoop-env.sh&quot;
  fi
  #5.指定java home
  # Attempt to set JAVA_HOME if it is not set
  if [[ -z $JAVA_HOME ]]; then
  # On OSX use java_home (or /Library for older versions)
  if [ &quot;Darwin&quot; == &quot;$(uname -s)&quot; ]; then
  if [ -x /usr/libexec/java_home ]; then
  export JAVA_HOME=($(/usr/libexec/java_home))
  else
  export JAVA_HOME=(/Library/Java/Home)
  fi
  fi
  # Bail if we did not detect it
  if [[ -z $JAVA_HOME ]]; then
  echo &quot;Error: JAVA_HOME is not set and could not be found.&quot; 1>&2
  exit 1
  fi
  fi
  #6.指定Java程序启动的heapsize,如果用户在hadoop-env.sh中指定了HADOOP_HEAPSIZE字段则会覆盖默认值1000m
  # some Java parameters
  JAVA_HEAP_MAX=-Xmx1000m
  # check envvars which might override default args
  if [ &quot;$HADOOP_HEAPSIZE&quot; != &quot;&quot; ]; then
  #echo &quot;run with heapsize $HADOOP_HEAPSIZE&quot;
  JAVA_HEAP_MAX=&quot;-Xmx&quot;&quot;$HADOOP_HEAPSIZE&quot;&quot;m&quot;
  #echo $JAVA_HEAP_MAX
  fi
  #7.指定程序的classpath,一大串代码,总结下就是
  HADOOP_CONF_DIR+HADOOP_CLASSPATH+HADOOP_COMMON_DIR+HADOOP_COMMON_LIB_JARS_DIR+
  HADOOP_COMMON_LIB_JARS_DIR+HADOOP_COMMON_LIB_NATIVE_DIR+HDFS_DIR+HDFS_LIB_JARS_DIR
  +YARN_DIR+YARN_LIB_JARS_DIR+MAPRED_DIR+MAPRED_LIB_JARS_DIR
  有一个要注意的,hadoop比较贴心的提供了HADOOP_USER_CLASSPATH_FIRST属性,如何设置了,
  则HADOOP_CLASSPATH(用户自定义classpath)会在hadoop自身的jar包前加载,用来解决用户
  想最先加载自定义的jar包情况。
  #8.指定HADOOP_OPTS,-Dhadoop.log.dir这些类似参数会在conf下的log4j配置中用到
  HADOOP_OPTS=&quot;$HADOOP_OPTS -Dhadoop.log.dir=$HADOOP_LOG_DIR&quot;
  HADOOP_OPTS=&quot;$HADOOP_OPTS -Dhadoop.log.file=$HADOOP_LOGFILE&quot;
  HADOOP_OPTS=&quot;$HADOOP_OPTS -Dhadoop.home.dir=$HADOOP_PREFIX&quot;
  HADOOP_OPTS=&quot;$HADOOP_OPTS -Dhadoop.id.str=$HADOOP_IDENT_STRING&quot;
  HADOOP_OPTS=&quot;$HADOOP_OPTS -Dhadoop.root.logger=${HADOOP_ROOT_LOGGER:-INFO,console}&quot;
  if [ &quot;x$JAVA_LIBRARY_PATH&quot; != &quot;x&quot; ]; then
  HADOOP_OPTS=&quot;$HADOOP_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH&quot;
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_LIBRARY_PATH
  fi
  HADOOP_OPTS=&quot;$HADOOP_OPTS -Dhadoop.policy.file=$HADOOP_POLICYFILE&quot;
  # Disable ipv6 as it can cause issues
  HADOOP_OPTS=&quot;$HADOOP_OPTS -Djava.net.preferIPv4Stack=true&quot;
  
  
  /usr/lib/hadoop-hdfs/bin/hdfs
  #1.加载/usr/lib/hadoop/libexec/hdfs-config.sh,但好像没啥作用
  #2.根据启动参数指定java的启动mainclass:
  if [ &quot;$COMMAND&quot; = &quot;namenode&quot; ] ; then
  CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
  HADOOP_OPTS=&quot;$HADOOP_OPTS $HADOOP_NAMENODE_OPTS&quot;
  #3.启动Java程序
  exec &quot;$JAVA&quot; -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS &quot;$@&quot;
  最后介绍几个配置的小例子。
  1.如何指定hadoop的log目录:
  从启动脚本中看几个配置的优先级排序是hadoop-env.sh>hadoop-config.sh>/etc/default/hadoop,因此我们如果想指定hadoop的log目录只需在hadoop-env.sh中添加一行:
  export HADOOP_LOG_DIR=xxxxx
  2.如何添加自己的jar包到hadoop中被namenode,datanode使用
  export HADOOP_CLASSPATH=xxxxx
  3.如何单独设定namenode的java heapsize。
  比如想设置namenode10G,datanode1G,这个就有点意思了。如果直接指定HADOOP_HEAPSIZE那么此参数会作用于namenode,datanode,而单独在namenode的参数中指定也会有点小问题哦,不过基本是可以使用的。
  总之,由于hadoop的启动脚本极其多而且琐碎,再加上hbase hive的启动脚本都是类似的结构,导致在添加修改一些配置时会产生很多莫名的问题,大家也可以在使用的过程中细细体会啦


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629012-1-1.html 上篇帖子: 在Mesos上运行Hadoop 下篇帖子: Hadoop入门——《Hadoop实战初级部分》学习笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表