月度归档:2012年10月

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程序

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

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

hadoop是基于java平台的,他有自己的启动及管理脚本,他的启动脚本是如何工作,他的程序是如何启动的,启动过程中配置文件如何传递的,他同普通java项目的区别在那里,为什么我们必须用hadoop脚本来启动hadoop系统以及运行我们自定义的程序。从本文开始,我们将正式进入hadoop源代码中,本文重点阐述hadoop启动过程中配置文件的加载,希望通过文章来解答上面的问题。

本文是对分析过程的一个描述,文章后面还会有两个视频文件, 分别是代码静态分析以及动态分析过程,大家根据习惯参考阅读。

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

http://www.iigrowing.cn/hadoop_src_introduction

希望通过这个能帮助我们理解生产中hadoop。 时间有限,经验不足,疏漏难免,在这里仅分享一些心得,希望对大家能起到一个抛砖引玉的作用,有问题请大家给我留言或者评论等,这样也能对我的工作有很大帮助。感谢您阅读这篇文章!

一.Hadoop文件组成

Hadoop程序解压缩完成后源代码如下图

clip_image001

Bin目录,hadoop脚本,管理及维护hadoop系统,

Conf目录,hadoop配置文件,hadoop系统相关信息等,

Docs目录,文档目录

Lib目录,hadoop依赖的相关jar文件

Src目录,hadoop源代码文件

Webapps目录, hadoop内嵌的webserver的j2ee程序目录

相关文件:

Build.xml文件时hadoop的ant编译配置文件

其他文件略

二.Hadoop基本启动过程

假设hadoop程序安装主目录用${hadoop_home}表示

管理人员可以执行${hadoop_home}\bin\start-all.sh文件启动hadoop系统

这个脚本将根据conf目录中相关配置文件,启动datanode,namenode,tasktracter,jobtracter等程序

Hadoop的几个主要配置文件如下:

clip_image002

那么脚本在启动hadoop程序中,配置文件信息如何传递给java程序,java程序是如何加载的?

本文将以datanode启动过程为例分析hadoop的配置文件传递,然后后续将逐步分析其他启动程序的配置文件的启动情况。

三.程序员角度看待hadoop启动

我们打开hadoop的源代码项目(eclipse的java项目)

clip_image004

如下图,我们打开如上目录及java源代码文件

clip_image006

双击左侧 main函数的节点, 然后右面显示相关源代码, 然后在

“runAndWait(new Configuration());”函数调用处,右击鼠标,弹出相关对话框,选择“open Declaration” 选项, 可以直接使用快捷方式 F3按键,可以快速到达相关源代码处

代码如下:

private static void runAndWait(Configuration conf) throws IOException {

run(conf); // 调用run函数,进行相关业务逻辑(注意这里的参数对象 conf是在哪里创建的????? 这个非常重要,呕!!!)

// Wait for sub threads to exit 等等线程 退出

for (Iterator iterator = subThreadList.iterator(); iterator.hasNext();) {

Thread threadDataNode = (Thread) iterator.next();

try {

threadDataNode.join();

} catch (InterruptedException e) {

if (Thread.currentThread().isInterrupted()) {

// did someone knock?

return;

}

}

}

}

下面我们看一下配置文件是在哪里创建,我们可以回顾一下main函数,如下图

clip_image007

看红色区域,代码,这个代码创建一个匿名的 配置对象,这个配置对象,采用默认的构造函数。

配置类的构造函数如下

/** A new configuration. */

public Configuration() {

defaultResources.add("hadoop-default.xml"); // 添加配置文件,最大问题,这里仅仅有文件名,没有文件路径,系统到哪里去找文件?

finalResources.add("hadoop-site.xml"); // 添加配置文件,同上面有相同问题

}

稍后我们在解释。。。

下面我们看一下run函数(这里run函数同java线程里面的run函数不是同一个类型的,仅仅是名称相同)

/** Start datanode daemons.

* Start a datanode daemon for each comma separated data directory

* specified in property dfs.data.dir

*/

public static void run(Configuration conf) throws IOException {

String[] dataDirs = conf.getStrings("dfs.data.dir"); // 这里面就调用了我们今天需要重点解决的问题,这里调用配置,配置从哪里来的。 Conf对象在哪里来的

 

下面代码不再今天解释之列,今天可以忽略!!!

subThreadList = new Vector(dataDirs.length);

for (int i = 0; i < dataDirs.length; i++) {

DataNode dn = makeInstanceForDir(dataDirs[i], conf);

if (dn != null) {

Thread t = new Thread(dn, "DataNode: "+dataDirs[i]);

t.setDaemon(true); // needed for JUnit testing

t.start();

subThreadList.add(t);

}

}

}

本函数中重点是: String[] dataDirs = conf.getStrings("dfs.data.dir"); 这行语句的相关情况,直接关联hadoop启动过程中,配置文件的相关获取方法。并且这个过程在整个hadoop中都是类似的,仅仅是获取的配置信息不同而已,但是过程,方法都是非常相似的。

上面函数将调用下面的函数,如下

/** Returns the value of the <code>name</code> property as an array of

* strings. If no such property is specified, then <code>null</code>

* is returned. Values are whitespace or comma delimted.

*/

public String[] getStrings(String name) {

String valueString = get(name); // 重点语句,负责初始化相关代码,我们需要跟踪进入相关代码

if (valueString == null)

return null;

StringTokenizer tokenizer = new StringTokenizer (valueString,", \t\n\r\f");

List values = new ArrayList();

while (tokenizer.hasMoreTokens()) {

values.add(tokenizer.nextToken());

}

return (String[])values.toArray(new String[values.size()]);

}

相关函数代码如下:

/** Returns the value of the <code>name</code> property, or null if no

* such property exists. */

public String get(String name) { return getProps().getProperty(name);}

如下图中用特别颜色标注的代码。

clip_image008

getProps()这是个函数调用,函数调用后会返回一个对象。

getProps().getProperty(name);,根据前一个函数返回的对象,然后调用哪个对象的一个函数

下面是getProps函数的代码

private synchronized Properties getProps() {

if (properties == null) { // 请特别注意这里面的代码,当系统构造配置对象后,这个对象默认是null值的,因此将执行下面代码块中语句的

Properties newProps = new Properties(); // 创建一个资源

loadResources(newProps, defaultResources, false, false); // 装载一个资源,本函数中关键代码!!!!

loadResources(newProps, finalResources, true, true);

properties = newProps;

}

return properties;

}

下面是 配置类中properties 的定义,如下:

private Properties properties; // java中对象默认没有new时 是null的。

装载资源文件函数如下

private void loadResources(Properties props,

ArrayList resources,

boolean reverse, boolean quiet) {

ListIterator i = resources.listIterator(reverse ? resources.size() : 0);

while (reverse ? i.hasPrevious() : i.hasNext()) {

loadResource(props, reverse ? i.previous() : i.next(), quiet); // 循环装入配置文件中的配置,将配置信息存入Properties props中,返回给上层函数。(小问题:java参数一般都是传递值的, 为什么能返回数据给上层???)

}

}

具体装载资源函数如下

private void loadResource(Properties properties, Object name, boolean quiet) {

try {

DocumentBuilder builder =

DocumentBuilderFactory.newInstance().newDocumentBuilder();

Document doc = null;

// 我们目前的程序默认进入的,是走第一个if分支,即name是string类型的,相关情况可以在动态分析中获取到

if (name instanceof String) { // a CLASSPATH resource

URL url = getResource((String)name); // 从classpath路径中加载一个命名的资源,一般为文件等

if (url != null) {

LOG.info("parsing " + url);

doc = builder.parse(url.toString()); // 解析这个文件

}

} else if (name instanceof File) { // a file resource

File file = (File)name;

if (file.exists()) {

LOG.info("parsing " + file);

doc = builder.parse(file);

}

}

if (doc == null) {

if (quiet)

return;

throw new RuntimeException(name + " not found");

}

// 获取相关配置信息,本是系列文章重点,我们重点研究程序运行脉络,细节都可以忽略!!!!

Element root = doc.getDocumentElement();

if (!"configuration".equals(root.getTagName()))

LOG.severe("bad conf file: top-level element not <configuration>");

NodeList props = root.getChildNodes();

for (int i = 0; i < props.getLength(); i++) {

Node propNode = props.item(i);

if (!(propNode instanceof Element))

continue;

Element prop = (Element)propNode;

if (!"property".equals(prop.getTagName()))

LOG.warning("bad conf file: element not <property>");

NodeList fields = prop.getChildNodes();

String attr = null;

String value = null;

for (int j = 0; j < fields.getLength(); j++) {

Node fieldNode = fields.item(j);

if (!(fieldNode instanceof Element))

continue;

Element field = (Element)fieldNode;

if ("name".equals(field.getTagName()))

attr = ((Text)field.getFirstChild()).getData();

if ("value".equals(field.getTagName()) && field.hasChildNodes())

value = ((Text)field.getFirstChild()).getData();

}

if (attr != null && value != null)

properties.setProperty(attr, value);

}

} catch (Exception e) {

LOG.severe("error parsing conf file: " + e);

throw new RuntimeException(e);

}

}

这个类是上面调用的 加载资源的实现方法

/** Returns the URL for the named resource. */

public URL getResource(String name) {

return classLoader.getResource(name);

}

好了,我们已经基本分析完成启动的基本过程, 万里长征我们终于走出第一步,胜利就在我们脚下。

神秘面纱终于揭开一角,一切即将在眼前展现!!!!!

 

 

hadoop-启动-配置文件classpath-静态分析_x264.rar (17.63M, 2012年11月30日 09:56 到期)

进入下载页面

hadoop-启动-配置文件classpath-动态分析_x264.rar (39.41M, 2012年11月30日 09:56 到期)

进入下载页面

参考文章
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程序

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

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

原创文档,转载请将原文url地址标明

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

hadoop是开源项目,他已经提供了完整的源代码。但他的源代码是用ant编译的,没有提供基于ide环境的源代码项目,我们应用ant编译源码很方便,在命令行下分析源代码效率就比较低了,为此我们需要一个ide下java项目来高效分析hadoop的源代码。我们将开始hadoop源代码分析,首先创建java的eclipse项目,主要步骤如下,详情参见附录的 参考视频

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

一.下载hadoop源代码

下载地址如下

http://archive.apache.org/dist/hadoop/core/

在下载页面中选择需要下载的hadoop源代码,推荐选择下载0.1.0版本

原因如下:

1. 0.1.0版本代码非常少,并且可以运行

2. 经过简单比较,从0.1.0版本到0.20.0版本核心代码及核心结构基本保持不变,对学习hadoop原理无大影响。

3. 我们学习丛简单入手,逐步深入便于学习与入门

具体下载过程可以在附件的视频中看到

 

二. 启动eclipse程序

Hadoop程序是个标准的java程序,他提供了ant编译的脚本, 用户可以采用ant直接编译相关源代码。

但是若分析hadoop的源代码,一个集成的开发环境可以大大提高效率。

另外hadoop程序在linux系统下经过大量生产实践的,并且他本身设计也是主要面向linux环境,因此我们需要一个在linux下的eclipse环境来运行并调试我们的hadoop源程序

在我们提供的虚拟机中提供给的linux环境下已经存在一个eclipse程序。我们可以用如下方法运行它

cd /apps

tar xzvf eclipse.tar.gz

cd eclipse

./eclipse

最后运行eclipse项目

 

三.创建eclipse项目

打开eclipse的file菜单,选择新建,最后选择项目选项,如下:

clip_image001

 

用户选择Project…后会弹出相关项目对话框如下:

image_thumb2[1]

 

我们创建一个java项目,项目名称自己输入,其余选择默认就可以,相关过程参加创建过程视频

 

 

四.添加hadoop的源代码到项目中

1. 将已经下载的hadoop源代码解压缩到文件系统中

2. 打开文件系统相关目录

3. 拷贝src目录到java项目中

4. 打开项目的编译属性目录

5. 修改项目src属性,设置相关源代码目录,具体见参考视频

6. 拷贝lib,bin,conf,webapps等目录到项目中

7. 修改项目的编译属性,导入相关jar文件等

clip_image004

如上图,项目属性对话框操作

1。 在项目名称上 单击鼠标左键,鼠标右键单击, 弹出选择对话框

2. 选择build path项目

3. 选择configure build path。。。

clip_image005

在标签卡1中设置源代码相关项目, 在标签卡2中设置项目依赖的jar文件等,最后点击ok按钮

最后eclipse中,左侧源代码无编译错误(红色x),同时右下角Problems中无错误信息,项目编译无问题,项目创建完毕。

 

题外话: 本次一些列文章全部围绕hadoop展开, 文章中,相对描述较为详细,笔者个人认为已经接近罗嗦了。 但是考虑到为提高学习效果,争取做到读者看到文章以及参考视频等候,能独立根据相关信息进行独立的操作,这样印象才会深刻,也不流于形式。最终希望大家都能有所提高。

 

 

 

clip_image007

hadoop-vmware-0.1.0-www.iigrowing.cn.rar (37.26M, 2012年11月29日 10:33 到期)

进入下载页面

clip_image007[1]

hadoop-0.1.0-java-project.rar (50.17M, 2012年11月29日 10:33 到期)

进入下载页面

 

参考文章
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程序

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

原创文档,转载请将原文url地址标明

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

Hadoop是分布式的网络系统,网络环境是hadoop必备环境。尽管hadoop的演示程序或者默认配置是工作在没有网络环境的单机系统下,但那个配置仅仅是为演示某些概念或者特定的调试程序等使用,对于我们向好好研究hadoop系统而言就是比较简单了,我们时间工作工作可以有很多形式组成网络环境来进行hadoop的研究。为了方便起见我们通过vmware虚拟机搭建一个有3个节点的虚拟网络环境,通过这个环境我们可以方便研究hadoop系统。本文是hadoop系统文章的一部分,下面是系列文章的介绍:

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

http://www.iigrowing.cn/hadoop_src_introduction

希望通过这个能帮助我们理解生产中hadoop。 时间有限,经验不足,疏漏难免,在这里仅分享一些心得,希望对大家能起到一个抛砖引玉的作用,有问题请大家给我留言或者评论等,这样也能对我的工作有很大帮助。感谢您阅读这篇文章!

一.虚拟机网络设置

我们学习hadoop就需要学习明白hadoop的真正原理,这样我们才能更好利用它,因此一个合适的网络环境对我们是必须的。一个网络环境我们可以有很多选择,可以在局域网内找几台linux服务器等。

最简单的办法是采用vmware搭建三个linux服务器系统。让三台系统可以相互访问

如前一篇文章,我们已经创建了3台虚拟机u01,u02,u03。本文重点介绍虚拟机的网络配置。

1. 三台虚拟机需要在同一个虚拟机环境中运行,或者说在同一个pc机上运行

2. 三台虚拟机需要默认采用nat的网络设置

clip_image002

虚拟机网络配置图

这个方式的网络配置,一是可以不占用公司内部局域网的ip地址,又可以保证虚拟机可以正常访问互联网(本次的系列文章中,虚拟机都不需要访问互联网,但是如上需要从网络下载一些资料等,有可能需要)。

我们三台虚拟机都需要采用如上的配置,这样可以保证3台虚拟机都可以相互访问(当然大家可以采用另外配置方式但是要保证网络连通,并且能及时通信等等)。

二.Linux环境中网络设置

默认的虚拟机中网络是采用DHCP方式动态获取的ip地址等。在这种方式下,系统在运行一段时间后,当ip地址租赁期过去后,ip地址有可能会发生更改,因此服务器ip地址有可能发生变化,因此我们采用手动配置ip地址的办法。

(具体操作过程,参见 虚拟机参考配置视频

hadoop-vmware-0.1.0-www.iigrowing.cn.mp4 (37.77M, 2012年11月28日 17:10 到期)

进入下载页面

clip_image004

如上图,相关配置

clip_image005

最后配置成如上 情况。

最后,打开一个linux的终端窗口,然后输入

cat /etc/hosts

显示如下信息

clip_image006

我们三台虚拟机ip及用户及密码如下

机器名称

Ip地址

用户/密码

u01

192.168.100.101

sch/sch root/root

u02

192.168.100.102

sch/sch root/root

u03

192.168.100.103

sch/sch root/root

测试网络连接情况

clip_image007

如上图,输入 ssh u02 之后显示上面图像,则表明配置已经成功

类似,ssh u01

从新发布一下,虚拟机及参考视频下载地址

虚拟机文件,地址如下:

hadoop.0.1.0.part02.rar (700.00M, 2012年11月21日 00:19 到期)

进入下载页面

 

hadoop.0.1.0.part01.rar (700.00M, 2012年11月21日 00:19 到期)

进入下载页面

 

hadoop.0.1.0.part04.rar (313.02M, 2012年11月21日 00:16 到期)

进入下载页面

 

hadoop.0.1.0.part03.rar (700.00M, 2012年11月21日 00:16 到期)

进入下载页面

 

虚拟机配置参考视频

hadoop-vmware-0.1.0-www.iigrowing.cn.rar (37.26M, 2012年11月29日 10:33 到期)

进入下载页面

 

hadoop 的 eclipse项目创建过程

hadoop-0.1.0-java-project.rar (50.17M, 2012年11月29日 10:33 到期)

进入下载页面

 

参考文章
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程序

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

 

原创文档,转载请将原文url地址标明

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

hadoop是个工作集群,是个分布式的复杂系统,我们若直接在hadoop自身系统上分析hadoop系统不是一件容易的事情, 本文及后面几篇文章将引领您构建一个hadoop的分析环境,通过这个环境您将像开发eclipse项目一样研究hadoop程序了,只是稍微复杂了点。同时本文也是hadoop系列文章的一部分,系列文章介绍如下

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

1. Hadoop工作环境

Hadoop系统工作环境是linux系列的操作系统,在windows下无法进行工作集群的相关工作,尽管可以采用一些方法进行配置,但是仅仅作为开发调试环境使用,并且比较麻烦,相关内容可以到搜索引擎中去搜索,已经有很多文章进行介绍,这里不在多言。

大家可以自行准备一个linux环境,具体要求如下

1) Linux服务器 3台(>=3)

2) 3台处于同一个内网

3) 每台服务器上安装java,ant,eclipse等环境

Linux服务器可以采用vmware虚拟机进行搭建或者模拟,也可以采用其他虚拟机程序进行。

这里为了开发调试hadoop系统方便,采用linux系统搭建了一个linux虚拟机系统,系统中已经包括了,java,ant,eclipse等环境,大家可以直接下载。

2. 虚拟机文件下载

地址如下:

clip_image002

hadoop.0.1.0.part02.rar (700.00M, 2012年11月21日 00:19 到期)

进入下载页面

clip_image002[1]

hadoop.0.1.0.part01.rar (700.00M, 2012年11月21日 00:19 到期)

进入下载页面

clip_image002[2]

hadoop.0.1.0.part04.rar (313.02M, 2012年11月21日 00:16 到期)

进入下载页面

clip_image002[3]

hadoop.0.1.0.part03.rar (700.00M, 2012年11月21日 00:16 到期)

进入下载页面

3. 启动Vmware虚拟机

首先大家需要下载上面的4个压缩文件,下载后放到同一个目录中进行解压缩。

另外,大家首先需要安装一个 vmware虚拟机环境 vmware7以上版本

clip_image003

这里采用这个版本进行的开发测试,推荐用户采用这个版本或者高于这个版本的虚拟机系统

关于vmware软件下载请大家自行在搜索引擎中搜索下载,不提供,请支持正版,哈哈!

解压后参考目录结构如下:

clip_image004

首先运行 u03目录中 u03.Vmx

然后运行u01目录中u01.vmx文件显示如下界面

clip_image005

点击浏览按钮,选择u03目录

clip_image006

选择u03.Vmx

clip_image007

最后点击打开

类似方式打开u02虚拟机

4. 虚拟机环境网络配置

启动虚拟机软件,点击编辑菜单

clip_image008

如上图,选择配置 虚拟网络编辑菜单

图下图,选择vmnet8条目

clip_image009

设置subnet ip中地址 为192.168.100.0 选择应用, 最后点击ok关闭程序

至此虚拟机应该可以运行了,可能ip还有些小问题,我们下篇文章在讨论,今天太晚了,睡觉去啦,886!

 

参考文章
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程序