hadoop脚本分析
###1.start-all.sh
$>which start-all.sh
/soft/hadoop/sbin/start-all.sh
$>gedit start-all.sh
执行脚本顺序:
//先执行脚本hadoop-config.sh
. $HADOOP_LIBEXEC_DIR/hadoop-config.sh等同于/soft/hadoop/sbin/libexec/hadoop-config.sh
//start-dfs.sh脚本带了一个config的参数,可以指定单独的配置目录,需要传相关参数
/sbin/start-dfs.sh --config $HADOOP_CONF_DIR
//可以指定单独的配置目录,需要传相关参数
/sbin/start-yarn.sh --config $HADOOP_CONF_DIR
start-all.sh脚本中的执行内容及顺序总体如下:
a.设置变量
b.启动hdfs
c.启动yarn
###2.hadoop-config.sh
hadoop的common目录:HADOOP_COMMON_DIR=${HADOOP_COMMON_DIR:-"share/hadoop/common"}
hadoop的common的jar包目录:HADOOP_COMMON_LIB_JARS_DIR=${HADOOP_COMMON_LIB_JARS_DIR:-"share/hadoop/common/lib"}
native的目录:HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_COMMON_LIB_NATIVE_DIR:-"lib/native"}
hdfs的目录:HDFS_DIR=${HDFS_DIR:-"share/hadoop/hdfs"}
hdfs的jar包的目录:HDFS_LIB_JARS_DIR=${HDFS_LIB_JARS_DIR:-"share/hadoop/hdfs/lib"}
yarn的目录:YARN_DIR=${YARN_DIR:-"share/hadoop/yarn"}
yarn的jar包的目录:YARN_LIB_JARS_DIR=${YARN_LIB_JARS_DIR:-"share/hadoop/yarn/lib"}
mapreduce的目录:MAPRED_DIR=${MAPRED_DIR:-"share/hadoop/mapreduce"}
mapreduce的jar包的目录:MAPRED_LIB_JARS_DIR=${MAPRED_LIB_JARS_DIR:-"share/hadoop/mapreduce/lib"}
调用hadoop-config.sh的时候可以带参数
# some Java parameters
JAVA_HEAP_MAX=-Xmx1000m 设置java的堆大小,默认为1000M
# check envvars which might override default args
if [ "$HADOOP_HEAPSIZE" != "" ]; then
#echo "run with heapsize $HADOOP_HEAPSIZE"
JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m"
#echo $JAVA_HEAP_MAX
fi
如果设置了$HADOOP_HEAPSIZE(hadoop的堆大小)这个变量,就以这个变量的值为准
# CLASSPATH initially contains $HADOOP_CONF_DIR
CLASSPATH="${HADOOP_CONF_DIR}"
设置类路径(相当于操作系统PATH的环境变量,一种搜素类的顺序);为了让hadoop运行之后的if语句,作用是不断的累加hadoop的类路径
执行命令查看hadoop的类路径:
$>hadoop classpath
该脚本的作用,设置一堆变量:
COMMON_DIR ----配置各个模块的目录
…
…
HADOOP_CONF_DIR=… ----hadoop的配置目录 在/etc目录下
HEAP_SIZE=1000m ----堆大小
CLASSPATH=… ----设置类库
###3.start-dfs.sh
该脚本内部的执行顺序
1.#调用/libexec目录下的hdfs-config.sh脚本-----等价于hadoop-config.sh,做一系列的变量设置
. $HADOOP_LIBEXEC_DIR/hdfs-config.sh
2.#获得名称节点的主机名
NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -namenodes)
3.#启用名称节点所调用的脚本为hadoop-daemons.sh
"$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \
--config "$HADOOP_CONF_DIR" \
--hostnames "$NAMENODES" \
--script "$bin/hdfs" start namenode $nameStartOpt
4.#启动datanode所用脚本为hadoop-daemons.sh,与启动namenode的区别是不带主机名
"$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \
--config "$HADOOP_CONF_DIR" \
--script "$bin/hdfs" start datanode $dataStartOpt
5.#启动2NN所用脚本为hadoop-daemons.sh
"$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \
--config "$HADOOP_CONF_DIR" \
--hostnames "$SECONDARY_NAMENODES" \
--script "$bin/hdfs" start secondarynamenode
6.接下来是HA与ZK相关内容,先不做介绍
###4./libexec/hdfs-config.sh
就是调用/libexec/hadoop-config.sh脚本 进行一堆的变量设置
DEFAULT_LIBEXEC_DIR="$bin"/../libexec
HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR}
if [ -e "${HADOOP_LIBEXEC_DIR}/hadoop-config.sh" ]; then
. ${HADOOP_LIBEXEC_DIR}/hadoop-config.sh
elif [ -e "${HADOOP_COMMON_HOME}/libexec/hadoop-config.sh" ]; then
. "$HADOOP_COMMON_HOME"/libexec/hadoop-config.sh
elif [ -e "${HADOOP_HOME}/libexec/hadoop-config.sh" ]; then
. "$HADOOP_HOME"/libexec/hadoop-config.sh
else
echo "Hadoop common not found."
exit
fi
###5./sbin/hadoop-daemons.sh
该脚本为启动守护进程脚本
1.先执行/libexec/hdfs-config.sh进行配置
2.对该内容进行如下解读:
"$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" \; "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@"
[bin/slaves.sh]
循环slaves文件,通过ssh方式去登陆远程主机,执行相应的命令
[bin/hadoop-daemon.sh]
调用:hadoop-config.sh
###6./bin/hadoop
调用:hadoop-config
最终也是在调用java程序进行类库的加载
###7./bin/hdfs
调用:hadoop-config
最终也是在调用java程序进行类库的加载
###8.分析脚本的目的
分析脚本为了知道在集群启动过程中,各个脚本之间是怎么调用的,为了更好的管理集群
daemons启动多个守护进程,daemon启动一个且在本机启动守护进程
单独启动namenode的命令:
$>hadoop-daemon.sh start namenode
在s100中执行命令,会发现2NN启动不起来:
$>hadoop-daemon.sh start secondarynamenode
正确方式:
$>ssh s104
$>hadoop-daemon.sh start secondarynamenode
在s100中启动与关闭DN,发现可以在s100中启动DN:
$>hadoop-daemon.sh start namenode
$>hadoop-daemon.sh stop namenode
在s100中启动所有的DN,发现在s101-103之间启动了所有的DN:
$>hadoop-daemons.sh start namenode
可以登录到s102中去关闭DN:
$>hadoop-daemon.sh stop namenode
注:可以去WEB UI中查看相关DataNode信息
DataNode的信息配置在slaves文件中