Hadoop源代码分析 之hadoop配置及启动(2)—–classpath与启动shell脚本

原创文章,转载请指明出处并保留原文url地址

hadoop 相关视频下载地址: http://pan.baidu.com/share/link?shareid=223046310&uk=3073578852

hadoop服务器启动,管理命令,启动任务等都由脚本执行,那么hadoop脚本的启动过程是什么,是不是在任何hadoop节点上执行所有的hadoop命令都可以?为什么?本文我们将一起研究hadoop的启动脚本,理解hadoop的启动脚本最后这些问题基本就可以自己回答了。本文是hadoop系列文章之一,系列文章相关信息如下:

系列文章简介,hadoop代表一种新的编程思想,基于hadoop有很多衍生项目,充分利用他们是非常必要的,同时hadoop又是一个复杂系统,若能理解他的工作原理对我们将有非常大的帮助,我们以hadoop 0.1.0版本为基础逐步分析他的基本工作原理、结构、思路等等,本文是系统文章的一部分,系列文章详情参见

 

一.hadoop脚本文件功能简介

Hadoop系统启动脚本在 hadoop的安装目录的bin下,如下图

clip_image001

脚本文件如下

Hadoop,hadoop的实际执行脚本,主要功能都在这个脚本中,很多脚本最终都要调用这个脚本执行相关功能

hadoop-daemon.sh,hadoop后台进程脚本,但最终实际功能的脚本还是调用hadoop脚本进行,如下图

clip_image002

hadoop-daemons.sh, hadoop的脚本执行,最终通过slaves.sh 调用远程服务器上的相应脚本

clip_image003

slaves.sh,hadoop相关服务器节点调用的脚本

start-all.sh, hadoop启动脚本

stop-all.sh, hadoop停止脚本

二.Hadoop启动脚本分析----------调用顺序分析

image

图中,箭头方向就是调用方向及调用顺序, 在跨机器调用时,采用了另一种箭头表示,注意区别。

三.Hadoop脚本简要分析

Hadoop的启动脚本,首先是start-all.sh,我们先来分析这个脚本

1. start-all.sh

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start-all.sh 开始

#!/bin/bash

# Start all hadoop daemons. Run this on master node.

bin=`dirname "$0"` // 执行 将当前命令行参数(参数0是整个命令行参数)做为参数执行dirname命令, 获取脚本目录, 数据最后保存在bin变量中

bin=`cd "$bin"; pwd` // 进入脚本所在目录,并显示当前目录,将当前目录路径存储在bin变量中(本脚本才有效果的局部变量)

# start dfs daemons

# start namenode after datanodes, to minimize time namenode is up w/o data

# note: datanodes will log connection errors until namenode starts

"$bin"/hadoop-daemons.sh start datanode // 调用bin目录下的脚本,启动全部集群的 数据节点, 从这个脚本可以看到, hadoop启动时先启动的是 数据节点,这个最先启动,稍后我们也将最先分析这个代码,然后一步步分析别的代码模块。

"$bin"/hadoop-daemon.sh start namenode // 启动 hadoop 名称节点

# start mapred daemons

# start jobtracker first to minimize connection errors at startup

"$bin"/hadoop-daemon.sh start jobtracker // 启动工作任务调度节点,这两个任务我们最后分析

"$bin"/hadoop-daemons.sh start tasktracker // 启动工作任务执行节点

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< start-all.sh 结束

2. hadoop-daemons.sh脚本代码如下(注意这里面的s)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hadoop-daemons.sh 开始

#!/bin/bash

#

# Run a Hadoop command on all slave hosts. 在全部的hadoop从节点上运行hadoop命令

usage="Usage: hadoop-daemons.sh [start|stop] command args..." // 声明一个变量,存储使用提示信息

# if no args specified, show usage

if [ $# -le 1 ]; then // 检查参数,若是参数数量小1,显示使用方法退出

echo $usage

exit 1

fi

bin=`dirname "$0"` // 取得当前hadoop的配置目录,并进入,但是当shell程序退出后,恢复到原目录

bin=`cd "$bin"; pwd`

exec "$bin/slaves.sh" "$bin/hadoop-daemon.sh" "$@" // 将"$bin/hadoop-daemon.sh" "$@"部分作为参数传递给新的shell 程序“$bin/slaves.sh”,这些程序是在当前shell进程中进行的

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< hadoop-daemons.sh 结束

3.slaves.sh脚本分析

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> slaves.sh 开始

#!/bin/bash

#

# Run a shell command on all slave hosts.

#

# Environment Variables

#

# HADOOP_SLAVES File naming remote hosts. Default is ~/.slaves

# HADOOP_CONF_DIR Alternate conf dir. Default is ${HADOOP_HOME}/conf.

# HADOOP_SLAVE_SLEEP Seconds to sleep between spawning remote commands.

##

usage="Usage: slaves.sh command..." // 添加使用说明

# if no args specified, show usage // 检查参数格式及使用方法

if [ $# -le 0 ]; then

echo $usage

exit 1

fi

# resolve links - $0 may be a softlink // 解决软连接的问题

this="$0"

while [ -h "$this" ]; do

ls=`ls -ld "$this"`

link=`expr "$ls" : '.*-> \(.*\)$'`

if expr "$link" : '.*/.*' > /dev/null; then

this="$link"

else

this=`dirname "$this"`/"$link"

fi

done

# the root of the Hadoop installation

HADOOP_HOME=`dirname "$this"`/.. // 设置hadoop_home的环境变量

# Allow alternate conf dir location. // hadoop配置的位置

HADOOP_CONF_DIR="${HADOOP_CONF_DIR:=$HADOOP_HOME/conf}"

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

source "${HADOOP_CONF_DIR}/hadoop-env.sh" // 执行 环境脚本,主要是一些设置,例如java设置等,本文末尾注释中包括了,这个脚本,详情参见文档末尾

脚本执行后JAVA_HOME环境变量就在这里生效,HADOOP_LOG_DIR等可选定义的环境变量也会生效,只要定义啦

fi

if [ "$HADOOP_SLAVES" = "" ]; then

export HADOOP_SLAVES="${HADOOP_CONF_DIR}/slaves" // 输出hadoop从节点等配置

fi

# By default, forward HADOOP_CONF_DIR environment variable to the

# remote slave. Remote slave must have following added to its

# /etc/ssh/sshd_config:

# AcceptEnv HADOOP_CONF_DIR

# See'man ssh_config for more on SendEnv and AcceptEnv.

if [ "$HADOOP_SSH_OPTS" = "" ]; then

export HADOOP_SSH_OPTS="-o ConnectTimeout=1 -o SendEnv=HADOOP_CONF_DIR"

fi

for slave in `cat "$HADOOP_SLAVES"`; do

ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \ // 通过ssh远程执行调用这个脚本传入的程序,如“exec "$bin/slaves.sh" "$bin/hadoop-daemon.sh" "$@"”中,“"$bin/hadoop-daemon.sh" "$@"”部分

2>&1 | sed "s/^/$slave: /" &

if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then

sleep $HADOOP_SLAVE_SLEEP

fi

done

wait

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< slaves.sh 结束

4. hadoop-daemon.sh脚本工作情况,注意这里面没有(s,请注意同前面带s的脚本的差异)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hadoop-daemon.sh 开始

#!/bin/bash

#

# Runs a Hadoop command as a daemon.

#

# Environment Variables

#

# HADOOP_CONF_DIR Alternate conf dir. Default is ${HADOOP_HOME}/conf.

# HADOOP_LOG_DIR Where log files are stored. PWD by default.

# HADOOP_MASTER host:path where hadoop code should be rsync'd from

# HADOOP_PID_DIR The pid files are stored. /tmp by default.

# HADOOP_IDENT_STRING A string representing this instance of hadoop. $USER by default

##

usage="Usage: hadoop-daemon [start|stop] [hadoop-command] [args...]"

# if no args specified, show usage

if [ $# -le 1 ]; then

echo $usage

exit 1

fi

# get arguments // 通过移动参数办法获取 命令等参数

startStop=$1

shift

command=$1

shift

# resolve links - $0 may be a softlink

this="$0"

while [ -h "$this" ]; do

ls=`ls -ld "$this"`

link=`expr "$ls" : '.*-> \(.*\)$'`

if expr "$link" : '.*/.*' > /dev/null; then

this="$link"

else

this=`dirname "$this"`/"$link"

fi

done

# the root of the Hadoop installation

HADOOP_HOME=`dirname "$this"`/.. // 获取hadoop目录

# Allow alternate conf dir location.

HADOOP_CONF_DIR="${HADOOP_CONF_DIR:-$HADOOP_HOME/conf}"

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

source "${HADOOP_CONF_DIR}/hadoop-env.sh" // 执行配置文件

fi

# get log directory

if [ "$HADOOP_LOG_DIR" = "" ]; then

HADOOP_LOG_DIR="$HADOOP_HOME/logs"

mkdir -p "$HADOOP_LOG_DIR"

fi

if [ "$HADOOP_PID_DIR" = "" ]; then

HADOOP_PID_DIR=/tmp

fi

if [ "$HADOOP_IDENT_STRING" = "" ]; then

HADOOP_IDENT_STRING=$USER

fi

# some variables

log=$HADOOP_LOG_DIR/hadoop-$HADOOP_IDENT_STRING-$command-`hostname`.log

pid=$HADOOP_PID_DIR/hadoop-$HADOOP_IDENT_STRING-$command.pid

case $startStop in

(start)

if [ -f $pid ]; then

if [ -a /proc/`cat $pid` ]; 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 $HADOOP_MASTER/ "$HADOOP_HOME"

fi

cd "$HADOOP_HOME"

echo starting $command, logging to $log

nohup bin/hadoop $command "$@" >& "$log" < /dev/null & // 具体执行相关程序功能,通过调用 hadoop脚本的方式

echo $! > $pid

sleep 1; head "$log"

;;

(stop) // 这个分支同上类似

if [ -f $pid ]; then

if [ -a /proc/`cat $pid` ]; 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

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< hadoop-daemon.sh 结束

5 hadoop 脚本工作过程分析,这个脚本是大部分hadoop脚本最终需要调用的,因此是我们重点分析的一个脚本

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hadoop 开始

#!/bin/bash

#

# The Hadoop command script

#

# Environment Variables

#

# JAVA_HOME The java implementation to use. Overrides JAVA_HOME.

#

# HADOOP_HEAPSIZE The maximum amount of heap to use, in MB.

# Default is 1000.

#

# HADOOP_OPTS Extra Java runtime options.

#

# HADOOP_CONF_DIR Alternate conf dir. Default is ${HADOOP_HOME}/conf.

#

# resolve links - $0 may be a softlink

THIS="$0"

while [ -h "$THIS" ]; do

ls=`ls -ld "$THIS"`

link=`expr "$ls" : '.*-> \(.*\)$'`

if expr "$link" : '.*/.*' > /dev/null; then

THIS="$link"

else

THIS=`dirname "$THIS"`/"$link"

fi

done

# if no args specified, show usage

if [ $# = 0 ]; then // 在没有参数时,显示相关提示信息

echo "Usage: hadoop COMMAND"

echo "where COMMAND is one of:"

echo " namenode -format format the DFS filesystem"

echo " namenode run the DFS namenode"

echo " datanode run a DFS datanode"

echo " dfs run a DFS admin client"

echo " fsck run a DFS filesystem checking utility"

echo " jobtracker run the MapReduce job Tracker node"

echo " tasktracker run a MapReduce task Tracker node"

echo " job manipulate MapReduce jobs"

echo " jar <jar> run a jar file"

echo " or"

echo " CLASSNAME run the class named CLASSNAME"

echo "Most commands print help when invoked w/o parameters."

exit 1

fi

# get arguments

COMMAND=$1

shift

# some directories

THIS_DIR=`dirname "$THIS"`

HADOOP_HOME=`cd "$THIS_DIR/.." ; pwd` // 取得hadoop的home目录

# Allow alternate conf dir location.

HADOOP_CONF_DIR="${HADOOP_CONF_DIR:-$HADOOP_HOME/conf}"

// 取得hadoop配置文件的目录

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

source "${HADOOP_CONF_DIR}/hadoop-env.sh" // 执行配置文件中的环境变量等

fi

# some Java parameters

if [ "$JAVA_HOME" != "" ]; then // 设置java home变量,非常重要,主要在上面的 env.sh脚本中执行的

#echo "run java in $JAVA_HOME"

JAVA_HOME=$JAVA_HOME

fi

if [ "$JAVA_HOME" = "" ]; then

echo "Error: JAVA_HOME is not set."

exit 1

fi

JAVA=$JAVA_HOME/bin/java // 设置局部变量,java命令的变量

JAVA_HEAP_MAX=-Xmx1000m // java的内存参数等

# 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

//////// 请万分注意了,下面这些代码是本文重点中的重点了,务必仔细观看!!!

# CLASSPATH initially contains $HADOOP_CONF_DIR

CLASSPATH="${HADOOP_CONF_DIR}" // 这一句代码非常重要, 设置了hadoop的配置文件目录为classpath中的一个条目,并且最优先,一般java在classpath加载资源时都是按照classpath中出现顺序来优先获取的。 Hadoop中配置文件就是在classpath中加载的资源,这个也就解释了,为什么没有正确配置classpath时,eclipse的hadoop项目没办法启动。就是因为在classpath中找不到 配置用的 *.xml文件。

Hadoop脚本为了避免这个情况,在设置classpath时,最先设置了这个配置目录到classpath中,并且放到最前面拉,优先搜索

CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar

# for developers, add Hadoop classes to CLASSPATH

if [ -d "$HADOOP_HOME/build/classes" ]; then

CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/classes

fi

if [ -d "$HADOOP_HOME/build/webapps" ]; then

CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build

fi

if [ -d "$HADOOP_HOME/build/test/classes" ]; then

CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/test/classes

fi

# so that filenames w/ spaces are handled correctly in loops below

IFS=

# for releases, add hadoop jars & webapps to CLASSPATH

if [ -d "$HADOOP_HOME/webapps" ]; then

CLASSPATH=${CLASSPATH}:$HADOOP_HOME

fi

for f in $HADOOP_HOME/hadoop-*.jar; do

CLASSPATH=${CLASSPATH}:$f;

done

# add libs to CLASSPATH

for f in $HADOOP_HOME/lib/*.jar; do

CLASSPATH=${CLASSPATH}:$f;

done

for f in $HADOOP_HOME/lib/jetty-ext/*.jar; do

CLASSPATH=${CLASSPATH}:$f;

done

# restore ordinary behaviour

unset IFS

////// 下面的代码我们可以看到,启动不同任务时,调用哪个java的类等,请大家仔细看啦

# figure out which class to run

if [ "$COMMAND" = "namenode" ] ; then

CLASS='org.apache.hadoop.dfs.NameNode' // namenode的节点主类,大家都应该内能看董吧!!!!

elif [ "$COMMAND" = "datanode" ] ; then

CLASS='org.apache.hadoop.dfs.DataNode'

elif [ "$COMMAND" = "dfs" ] ; then

CLASS=org.apache.hadoop.dfs.DFSShell

elif [ "$COMMAND" = "fsck" ] ; then

CLASS=org.apache.hadoop.dfs.DFSck

elif [ "$COMMAND" = "jobtracker" ] ; then

CLASS=org.apache.hadoop.mapred.JobTracker

elif [ "$COMMAND" = "tasktracker" ] ; then

CLASS=org.apache.hadoop.mapred.TaskTracker

elif [ "$COMMAND" = "job" ] ; then

CLASS=org.apache.hadoop.mapred.JobClient

elif [ "$COMMAND" = "jar" ] ; then

JAR="$1"

shift

CLASS=`"$0" org.apache.hadoop.util.PrintJarMainClass "$JAR"`

if [ $? != 0 ]; then

echo "Error: Could not find main class in jar file $JAR"

exit 1

fi

CLASSPATH=${CLASSPATH}:${JAR}

else

CLASS=$COMMAND

fi

# cygwin path translation

if expr `uname` : 'CYGWIN*' > /dev/null; then

CLASSPATH=`cygpath -p -w "$CLASSPATH"`

fi

# run it // 到了这里,应该问题都解决啦!!! 配置,命令,参数都已经有了,现在就是 用java执行它啦,剩下我们去java项目中一个个去观察相关影响了。

exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< hadoop 结束

附加一些linux脚本的命令解释!

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> dirname

Linux命令之dirname - 截取给定路径的目录部分

用途说明

dirname命令可以取给定路径的目录部分(strip non-directory suffix from file name)。这个命令很少直接在shell命令行中使用,我一般把它用在shell脚本中,用于取得脚本文件所在目录,然后将当前目录切换过去。根据手册 页上说的“Print NAME with its trailing /component removed; if NAME contains no /’s, output ‘.’ (meaning the current directory).”,似乎说“取给定路径的目录部分” 并不能很准确的概括dirname命令的用途。Linux下还有一个命令是basename,它与dirname相反,是取得文件名称部分。

使用示例

示例一 来自手册页的例子

[root@qzt196 ~]# dirname /usr/bin/sort

/usr/bin

[root@qzt196 ~]# dirname stdio.h

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< dirname

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> exec

shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。

因此,如果你在一个shell里面,执行exec ls那么,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,执行结束自然也就退出了。为 了避免这个影响我们的使用,一般将exec命令放到一个shell脚本里面,用主脚本调用这个脚本,调用点处可以用bash a.sh,(a.sh就是存放该命令的脚本),这样会为a.sh建立一个sub shell去执行,当执行到exec后,该子脚本进程就被替换成了相应的exec的命令。

source命令或者".",不会为脚本新建shell,而只是将脚本包含的命令在当前shell执行。

不过,要注意一个例外,当exec命令来对文件描述符操作的时候,就不会替换shell,而且操作完成后,还会继续执行接下来的命令。

exec 3<&0:这个命令就是将操作符3也指向标准输入。

另外,这个命令还可以作为find命令的一个选项,如下所示:

(1)在当前目录下(包含子目录),查找所有txt文件并找出含有字符串"bin"的行

find ./ -name "*.txt" -exec grep "bin" {} \;

(2)在当前目录下(包含子目录),删除所有txt文件

find ./ -name "*.txt" -exec rm {} \;

linux下shell脚本执行方法及exec和source命令 (2011-03-04 15:11)

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。

bash shell的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。

在说明exe和source的区别之前,先说明一下fork的概念。

fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。

环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。

shell script:

有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不再启用其他shell。

新产生一个shell然后再执行scripts的方法是在scripts文件开头加入以下语句

#!/bin/sh

一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。

另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。

source:

source命令即点(.)命令。

在 bash下输入man source,找到source命令解释处,可以看到解释"Read and execute commands from filename in the current shell environment and ..."。从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。

exec:

在bash下输入man exec,找到exec命令解释处,可以看到有"No new process is created."这样的解释,这就是说exec命令不产生新的子进程。那么exec与source的区别是什么呢?

exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。

exec [-cl] [-a name] [command [arguments]]

If command is specified, it replaces the shell. No new process is created. The arguments become the arguments to command. If

the -l option is supplied, the shell places a dash at the beginning of the zeroth arg passed to command. This is what login(1)

does. The -c option causes command to be executed with an empty environment. If -a is supplied, the shell passes name as the

zeroth argument to the executed command. If command cannot be executed for some reason, a non-interactive shell exits, unless

the shell option execfail is enabled, in which case it returns failure. An interactive shell returns failure if the file can-

not be executed. If command is not specified, any redirections take effect in the current shell, and the return status is 0.

If there is a redirection error, the return status is 1.

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< exec

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hadoop-env.sh

# Set Hadoop-specific environment variables here.

# The only required environment variable is JAVA_HOME. All others are

# optional. When running a distributed configuration it is best to

# set JAVA_HOME in this file, so that it is correctly defined on

# remote nodes.

# The java implementation to use. Required.

# export JAVA_HOME=/usr/bin/java

# The maximum amount of heap to use, in MB. Default is 1000.

# export HADOOP_HEAPSIZE=2000

# Extra Java runtime options. Empty by default.

# export HADOOP_OPTS=-server

# Extra ssh options. Default: '-o ConnectTimeout=1 -o SendEnv=HADOOP_CONF_DIR'.

# export HADOOP_SSH_OPTS="-o ConnectTimeout=1 -o SendEnv=HADOOP_CONF_DIR"

# Where log files are stored. $HADOOP_HOME/logs by default.

# export HADOOP_LOG_DIR=${HADOOP_HOME}/logs

# File naming remote slave hosts. $HADOOP_HOME/conf/slaves by default.

# export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves

# host:path where hadoop code should be rsync'd from. Unset by default.

# export HADOOP_MASTER=master:/home/$USER/src/hadoop

# Seconds to sleep between slave commands. Unset by default. This

# can be useful in large clusters, where, e.g., slave rsyncs can

# otherwise arrive faster than the master can service them.

# export HADOOP_SLAVE_SLEEP=0.1

# The directory where pid files are stored. /tmp by default.

# export HADOOP_PID_DIR=/var/hadoop/pids

# A string representing this instance of hadoop. $USER by default.

# export HADOOP_IDENT_STRING=$USER

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< hadoop-env.sh

 

参考文章
Hadoop源代码分析 之Datanode工作原理(5)—–拷贝文件过程总结

Hadoop源代码分析 之Datanode工作原理(4)—–拷贝本地文件到hadoop的过程

Hadoop源代码分析 之Datanode工作原理(3)—–datanode工作过程总结

hadoop源代码介绍

Hadoop源代码分析 之Datanode工作原理(2)—–datanode基本工作过程

Hadoop源代码分析 之Datanode工作原理(1)—–datanode启动过程代码分析

Hadoop源代码分析 之hadoop配置及启动(4)—–启动过程汇总

Hadoop源代码分析 之hadoop配置及启动(3)—–classpath与hadoop主要组件启动过程

Hadoop源代码分析 之hadoop配置及启动(2)—–classpath与启动shell脚本

Hadoop源代码分析 之hadoop配置及启动(1)—–classpath与配置文件

Hadoop源代码分析 之hadoop源代码项目(1)—–创建eclipse下java项目

Hadoop源代码分析 之环境配置(2)—–虚拟机ip配置

Hadoop源代码分析 之环境配置(1)—–hadoop虚拟机配置

Hadoop源代码分析 之概念介绍(2)—–初学者眼中的hadoop

Hadoop源代码分析 之概念介绍(1)—–服装加工,火车货物检查与hadoop

调试eclipse下hadoop的map reduce程序

发表评论