hadoop学習5-start-all.shからソースコードをデバッグ

52803 ワード

hadoop0.20.2
ほかのところを参照してください.
 
第1節 start-all.shスクリプト
    このスクリプトは簡単です.このスクリプトを実行したディレクトリに基づいてhadoopディレクトリをインストールするbinディレクトリに入り、hdfsとmapredを起動する起動スクリプトを実行します.
1 bin=`dirname "$0"`
2 bin=`cd "$bin"; pwd`
3 . "$bin"/hadoop-config.sh
4 # start dfs daemons
5 "$bin"/start-dfs.sh --config $HADOOP_CONF_DIR
6 # start mapred daemons
7 "$bin"/start-mapred.sh --config $HADOOP_CONF_DIR


第2節 Start-dfs.shスクリプト
    このスクリプトは、まずパラメータが含まれているかどうかを確認します.コードは次のとおりです.
 1 if [ $# -ge 1 ]; then
 2 nameStartOpt=$1
 3 shift
 4 case $nameStartOpt in
 5 (-upgrade)
 6           ;;
 7         (-rollback)
 8           dataStartOpt=$nameStartOpt
 9           ;;
10         (*)
11             echo $usage
12             exit 1
13           ;;
14       esac
15 fi


    以上のコードから、このスクリプトはupgradeとrollbackの2つのオプションパラメータのみをサポートしています.1つのパラメータはファイルシステムを更新するために使用され、もう1つはファイルシステムをロールバックするために使用されます.
    次に、namenode、datanode、secondarynamenodeノードの起動を開始します.スクリプトコードは次のとおりです.
1 "$bin"/hadoop-daemon.sh --config $HADOOP_CONF_DIR start namenode $nameStartOpt
2 "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR start datanode $dataStartOpt
3 "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR --hosts masters start secondarynamenode


    コードの$HADOOP_CONF_DIRは別のスクリプトで設定されています.このスクリプトはhadoop-config.shです.後で詳しく説明します.このスクリプトは各起動スクリプトの実行で先に実行されるため、JAVA_などの環境変数のチェックと設定を目的としています.HOMEとHADOOP_HOMEなど、このスクリプトはhadoop-env.shスクリプトを実行してユーザー構成に関する環境変数を設定します.この2つのスクリプトについては後述します.
     上のスクリプトコードから、namenodeノードの起動がhadoop-daemon.shスクリプトで開始されていることがわかります.次のセクションでは、このスクリプトを分析します.Datanodeノードとsecondarynamenodeノードの起動はhadoop-daemon.shスクリプトで実行されます.このスクリプトの実行状況も後で分析します.
第3節 hadoop-daemon.shスクリプト
このスクリプトを具体的に説明する前に、いくつかの環境変数の意味を説明します(このスクリプトの注釈セクションで説明します):
1 HADOOP_CONF_DIR          。   ${HADOOP_HOME}/conf。
2 HADOOP_LOG_DIR            。    PWD        
3 HADOOP_MASTER    host:path where hadoop code should be rsync'd from
4 HADOOP_PID_DIR   The pid files are stored. /tmp by default.
5 HADOOP_IDENT_STRING   A string representing this instance of hadoop. $USER by default
6 HADOOP_NICENESS The scheduling priority for daemons. Defaults to 0.


    このスクリプトは、まず、パラメータが1未満であるかどうかを判断します.小さい場合は、このスクリプトを使用するヘルプを印刷します.shellコードは次のとおりです.
1 usage="Usage: hadoop-daemon.sh [--config <conf-dir>] [--hosts hostlistfile] (start|stop) <had    oop-command> <args...>"
2 if [ $# -le 1 ]; then
3    echo $usage
4    exit 1
5 fi


    その後、hadoop-config.shスクリプトを他のスクリプトと同様に実行し、関連する環境変数をチェックして設定します.このスクリプトでは、hadoop-config.shスクリプトの役割は、プロファイルとホストリストのファイルを処理し、対応する環境変数を設定して保存することです.
次に、起動または停止のコマンドと関連パラメータを保存します(shiftのshellスクリプトの役割は、shellスクリプトに含まれるパラメータを1つ前に移動することです).
1 startStop=$1
2 shift
3 command=$1
4 shift


     次に、ログをスクロールするための関数を定義します.詳細は分析されません.後述する環境変数は、コンフィギュレーションファイルのコンフィギュレーションオプションに基づいて設定されます.これらの環境変数は、スケジューリング優先度のある環境変数など、namenodeを具体的に起動するために使用されます.
最後に、コマンドに従ってnamenodeの起動停止(startまたはstop)を制御します.具体的なコードは以下の通りです.
 1 case $startStop in
 2    (start)
 3      mkdir -p "$HADOOP_PID_DIR"
 4      if [ -f $_HADOOP_DAEMON_PIDFILE ]; then
 5        if kill -0 `cat $_HADOOP_DAEMON_PIDFILE` > /dev/null 2>&1; then
 6          echo $command running as process `cat $_HADOOP_DAEMON_PIDFILE`.  Stop it first.
 7          exit 1
 8        fi
 9      fi
10  
11      if [ "$HADOOP_MASTER" != "" ]; then
12        echo rsync from $HADOOP_MASTER
13        rsync -a -e ssh --delete --exclude=.svn --exclude='logs/*' --exclude='contrib/hod/logs/    *' $HADOOP_MASTER/ "$HADOOP_HOME"
14      fi
15  
16      hadoop_rotate_log $_HADOOP_DAEMON_OUT
17      echo starting $command, logging to $_HADOOP_DAEMON_OUT
18      cd "$HADOOP_HOME"
19      nice -n $HADOOP_NICENESS "$HADOOP_HOME"/bin/hadoop --config $HADOOP_CONF_DIR $command "$@    " < /dev/null
20      ;;
21  
22    (stop)
23  
24      if [ -f $_HADOOP_DAEMON_PIDFILE ]; then
25        if kill -0 `cat $_HADOOP_DAEMON_PIDFILE` > /dev/null 2>&1; then
26          echo stopping $command
27          kill `cat $_HADOOP_DAEMON_PIDFILE`
28        else
29          echo no $command to stop
30        fi
31      else
32        echo no $command to stop
33      fi
34      ;;
35  
36    (*)
37      echo $usage
38      exit 1
39      ;;
40 esac           


     startがnamenodeを起動するコマンドである場合は、まずpidファイルを格納するディレクトリを作成し、pidを格納するファイルがすでに存在する場合はnamenodeノードがすでに実行されていることを示す説明があれば、まず起動を停止します.次にログスクロール関数に基づいてログファイルを生成し、最後にniceでスケジューリング優先度に基づいてnamenodeを起動しますが、最終的な起動には別のスクリプトhadoopがあります.このスクリプトはすべてのノードを起動する究極のスクリプトで、main関数付きクラスを選択してjavaで起動し、javaデーモンプロセスを本格的に起動する効果があります.このスクリプトは起動のポイントであり、hadoopソースコードを分析する入り口でもあるので、後の章で重点的に分析します.
stopコマンドであれば簡単な停止コマンドを実行しますが、その他はエラーで、このスクリプトを使用するドキュメントを印刷するプロンプトが表示されます.
第四節 hadoop-daemons.shとslaves.shスクリプト
      このスクリプトは簡単です.彼は最後に前節で紹介したスクリプトによって起動したからです.ただ、その前にいくつかの特殊な処理をしただけで、別のスクリプトslaves.shを実行します.コードは以下の通りです.
1 exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_HOME" \;"$bin/hadoop-daemon.sh"     --config $HADOOP_CONF_DIR "$@"


          Slaves.shスクリプトの主な機能は、sshによってすべてのノードから起動する起動スクリプトを実行することであり、上のコードの最後の2つのコマンドであり、hadoopのディレクトリに入ってbinディレクトリの下のhadoop-daemon.shスクリプトを実行することである.この機能を実行するコードは次のとおりです.
 1 if [ "$HOSTLIST" = "" ]; then
 2    if [ "$HADOOP_SLAVES" = "" ]; then
 3      export HOSTLIST="${HADOOP_CONF_DIR}/slaves"
 4    else
 5      export HOSTLIST="${HADOOP_SLAVES}"
 6    fi
 7  fi
 8  
 9 for slave in `cat "$HOSTLIST"|sed  "s/#.*$//;/^$/d"`; do
10   ssh $HADOOP_SSH_OPTS $slave {1}quot;${@// /\\ }" \
11     2>&1 | sed "s/^/$slave: /" &
12   if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then
13     sleep $HADOOP_SLAVE_SLEEP
14   fi
15  done 
16  wait


    以上のコードは、まず、ノードからのすべてのホスト名(slavesファイル、またはプロファイルに構成されている)を見つけ、forループを介してsshリモートバックグラウンドで起動スクリプトプログラムを順次実行し、プログラムが完了するまで待機してshellスクリプトを終了します.
     したがって、このスクリプトの主な機能は、ノードから対応するノードを起動するすべてのスクリプトを実行することです.このスクリプト実行datanodeはslavesファイルからdatanodeノードを見つけ、secondarynamenodeはmasterファイルでノードホストを見つけます(start-dfs.shスクリプトで-hosts マスターが指定します.そうしないと、デフォルトでslavesファイルが見つかります.datanodeはデフォルトで見つかります).
第五節 start-mapred.shスクリプト
    このスクリプトは2つの重要なコードについて、jobtrackerノードとtasktrackerノードをそれぞれ起動し、他の環境変数は対応するスクリプトで設定されます.以下のようにします.
1 "$bin"/hadoop-daemon.sh --config $HADOOP_CONF_DIR start jobtracker
2 "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR start tasktracker


    コードから分かるように、前節と同じ方法で起動するか、具体的には分析されていません.前節を見てください.
第六節 hadoopスクリプト
このスクリプトこそがポイントで、前のスクリプト実行はすべてこのスクリプト実行のために敷き詰められています.このスクリプトの機能もかなり強く、各ノードのサービスを起動するだけでなく、多くのコマンドやツールを実行することができます.各ノード・サービスの起動を含む、受信したパラメータに基づいてどのような機能を実行するかを決定します.このスクリプトの実行プロセスと機能について詳しく説明します.
ステップ1:binディレクトリに切り替えてスクリプトhadoop-config.shを実行します.コードは次のとおりです.
1 bin=`dirname "$0"`
2 bin=`cd "$bin"; pwd`
3 . "$bin"/hadoop-config.sh


ステップ2:hadoop実行インスタンスの名前とhadoopを実行する環境がwindowsの下のlinuxシミュレーション環境cygwinであるかどうかを検出します.コードは以下の通りです.
1 HADOOP_IDENT_STRING=${HADOOP_IDENT_STRING:-$USER}
2 cygwin=false
3 case "`uname`" in
4 CYGWIN*) cygwin=true;;
5 esac


ステップ3:パラメータの個数が0個であるかどうかを判断し、そうであればプリントスクリプトの使用方法を判断して終了し、そうでなければ具体的なコマンドを獲得し、コマンドのコードを獲得するのは以下の通りである.
1 COMMAND=$1
2 shift


ステップ4:プロファイルが存在するディレクトリの下にhadoop-env.shスクリプトがあるかどうかを判断し、実行します.コードは以下の通りです.
1  if [ -f "${HADOOP_CONF_DIR}/hadoop-env.sh" ]; then
2    . "${HADOOP_CONF_DIR}/hadoop-env.sh"
3  fi


ステップ5:java実行に関するパラメータ(例えばJAVA_HOME変数、jvmを実行する最大スタックスペースなど、コードは以下の通りです.
 1 if [ "$JAVA_HOME" != "" ]; then
 2   #echo "run java in $JAVA_HOME"
 3   JAVA_HOME=$JAVA_HOME
 4 fi
 5 if [ "$JAVA_HOME" = "" ]; then
 6   echo "Error: JAVA_HOME is not set."
 7   exit 1
 8 fi
 9 JAVA=$JAVA_HOME/bin/java
10 JAVA_HEAP_MAX=-Xmx1000m
11 if [ "$HADOOP_HEAPSIZE" != "" ]; then
12    JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m"
13 fi


ステップ6:CLASSSPATHを設定するには、設定しないと多くのクラスが見つからない可能性があります.CLASSSPATHにパスを設定するには、次のコードを参照してください.
 1 CLASSPATH="${HADOOP_CONF_DIR}"
 2 CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar
 3 if [ "$HADOOP_USER_CLASSPATH_FIRST" != "" ] && [ "$HADOOP_CLASSPATH" != "" ]     ; then
 4   CLASSPATH=${CLASSPATH}:${HADOOP_CLASSPATH}
 5 fi
 6 if [ -d "$HADOOP_HOME/build/classes" ]; then
 7   CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/classes
 8 fi
 9 if [ -d "$HADOOP_HOME/build/webapps" ]; then
10   CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build
11 fi
12 if [ -d "$HADOOP_HOME/build/test/classes" ]; then
13   CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/test/classes
14 fi
15 if [ -d "$HADOOP_HOME/build/tools" ]; then
16   CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/tools
17 fi


    上のコードは大きく省略されていますが、具体的には具体的なhadoopスクリプトを見ることができます.
ステップ7:ステップ3で保存したコマンドに基づいて、次のように対応する起動javaクラスを選択します.
 1 if [ "$COMMAND" = "classpath" ] ; then
 2   if $cygwin; then
 3     CLASSPATH=`cygpath -p -w "$CLASSPATH"`
 4   fi
 5   echo $CLASSPATH
 6   exit
 7 elif [ "$COMMAND" = "namenode" ] ; then
 8   CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
 9   HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"
10 elif [ "$COMMAND" = "secondarynamenode" ] ; then
11   CLASS='org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode'
12   HADOOP_OPTS="$HADOOP_OPTS $HADOOP_SECONDARYNAMENODE_OPTS"
13 elif [ "$COMMAND" = "datanode" ] ; then
14   CLASS='org.apache.hadoop.hdfs.server.datanode.DataNode'
15   HADOOP_OPTS="$HADOOP_OPTS $HADOOP_DATANODE_OPTS"
16 elif [ "$COMMAND" = "fs" ] ; then
17   CLASS=org.apache.hadoop.fs.FsShell
18 .....    
19 elif [[ "$COMMAND" = -*  ]] ; then
20   # class and package names cannot begin with a -
21   echo "Error: No command named \`$COMMAND' was found. Perhaps you meant \`h    adoop ${COMMAND#-}'"
22   exit 1
23 else
24   CLASS=$COMMAND
25 fi


     具体的には、それらのコマンドを実行することができます以上のコードから完全に見ることができ、どのコマンドを実行するか、どのクラスに具体的に対応するかが明確に対応しています.特定の機能のコードを分析するときに、エントリポイントを見つけることができます.上のコードの最後の2行目からhadoopスクリプトもjavaのjarパッケージやクラスを直接実行することができ、開発者が自分で開発したhadoopプラットフォームに基づくプログラムをテストするのに便利で、スクリプトが多くの知識を学ぶように見えます.
ステップ8:cygwin環境でパスを変換する必要がある場合、コードは次のとおりです.
1 if $cygwin; then
2    CLASSPATH=`cygpath -p -w "$CLASSPATH"`
3    HADOOP_HOME=`cygpath -w "$HADOOP_HOME"`
4    HADOOP_LOG_DIR=`cygpath -w "$HADOOP_LOG_DIR"`
5    TOOL_PATH=`cygpath -p -w "$TOOL_PATH"`
6    JAVA_LIBRARY_PATH=`cygpath -p -w "$JAVA_LIBRARY_PATH"`
7  fi


ステップ9:java実行に必要なローカルライブラリパスJAVA_を設定するLIBRARY_PATH、具体的なコードは以下の通りです.
 1 if [ -d "${HADOOP_HOME}/build/native" -o -d "${HADOOP_HOME}/lib/native" -o -    d "${HADOOP_HOME}/sbin" ]; then
 2   JAVA_PLATFORM=`CLASSPATH=${CLASSPATH} ${JAVA} -Xmx32m ${HADOOP_JAVA_PLATFO    RM_OPTS} org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
 3  
 4   if [ -d "$HADOOP_HOME/build/native" ]; then
 5     if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then
 6         JAVA_LIBRARY_PATH=${JAVA_LIBRARY_PATH}:${HADOOP_HOME}/build/native/$    {JAVA_PLATFORM}/lib
 7     else
 8         JAVA_LIBRARY_PATH=${HADOOP_HOME}/build/native/${JAVA_PLATFORM}/lib
 9     fi
10   fi
11   if [ -d "${HADOOP_HOME}/lib/native" ]; then
12     if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then
13       JAVA_LIBRARY_PATH=${JAVA_LIBRARY_PATH}:${HADOOP_HOME}/lib/native/${JAV    A_PLATFORM}
14     else
15       JAVA_LIBRARY_PATH=${HADOOP_HOME}/lib/native/${JAVA_PLATFORM}
16     fi
17   fi
18   _JSVC_PATH=${HADOOP_HOME}/sbin/${JAVA_PLATFORM}/jsvc
19 fi
20    cygwin        :
21 if $cygwin; then
22   JAVA_LIBRARY_PATH=`cygpath -p "$JAVA_LIBRARY_PATH"`
23 fi


ステップ10:hadoopオプション変数の設定:HADOOP_OPTS;
ステップ11:まず、実行ノードの起動ノード実行コマンドか通常のクライアントコマンドかを判断し、関連条件に基づいて実行モードを設定します(jvsc、su、normalの3種類があります).コードは以下の通りです.
 1 if [[ "$COMMAND" == *node ]] || [[ "$COMMAND" == *tracker ]]; then
 2   command_uc=$(echo $COMMAND| tr a-z A-Z) #     
 3   user_var="HADOOP_${command_uc}_USER"
 4   _HADOOP_DAEMON_USER=$(eval "echo \$user_var")
 5   _HADOOP_DAEMON_USER=${_HADOOP_DAEMON_USER:-$(id -un)}
 6   if [ -z "$_HADOOP_DAEMON_USER" ]; then
 7     echo Please specify a user to run the $COMMAND by setting $user_var
 8     exit 1
 9   elif  [ "$_HADOOP_DAEMON_USER" == "root" ]; then
10     echo May not run daemons as root. Please specify $user_var
11     exit 1
12   fi
13   if [ "$EUID" = "0" ] ; then
14     if [ "$COMMAND" == "datanode" ] && [ -x "$_JSVC_PATH" ]; then
15       _HADOOP_RUN_MODE="jsvc"
16     elif [ -x /bin/su ]; then
17       _HADOOP_RUN_MODE="su"
18     else
19       echo "Daemon wants to run as $_HADOOP_DAEMON_USER but script is runnin    g as root"
20   echo "and su is not available."
21       exit 1
22     fi
23   else
24     if [ "$_HADOOP_DAEMON_USER" != "$(whoami)" ]; then
25       echo Daemon wants to run as $_HADOOP_DAEMON_USER but not running as th    at user or root.
26       exit 1
27     fi
28     _HADOOP_RUN_MODE="normal"
29   fi
30 else
31   _HADOOP_RUN_MODE="normal"
32 fi


ステップ12:最後のステップは、上記の実行モードに基づいてコマンドを具体的に実行することです.datanodeノードだけがjsvcを使用して実行できます.次のコードに示します.
 1 case "$_HADOOP_RUN_MODE" in
 2   jsvc)
 3     case "$COMMAND" in
 4       datanode)
 5         _JSVC_STARTER_CLASS=org.apache.hadoop.hdfs.server.datanode.SecureDat    aNodeStarter
 6        ;;
 7        *)
 8          echo "Cannot start $COMMAND with jsvc"
 9          exit 1
10        ;;
11      esac
12  
13      if [ "$_HADOOP_DAEMON_DETACHED" = "true" ]; then
14        _JSVC_FLAGS="-pidfile $_HADOOP_DAEMON_PIDFILE
15                    -errfile &1
16                    -outfile $_HADOOP_DAEMON_OUT"
17      ese
18 .....      ,             :
19 exec "$_JSVC_PATH" -Dproc_$COMMAND \
20                         $_JSVC_FLAGS \
21                         -user "$_HADOOP_DAEMON_USER" \
22                         -cp "$CLASSPATH" \
23                         $JAVA_HEAP_MAX $HADOOP_OPTS \
24                         $_JSVC_STARTER_CLASS "$@"
25    ;;


suモードとnormalモードで実行されている場合、すべてのコマンドはjavaを使用して正常に実行できます.次のコードがあります.
 1    normal | su)
 2      # If we need to su, tack the command into a local variable
 3      if [ $_HADOOP_RUN_MODE = "su" ]; then
 4        _JAVA_EXEC="su $_HADOOP_DAEMON_USER -s $JAVA --"
 5      else
 6        _JAVA_EXEC="$JAVA"
 7      fi
 8      if [ "$_HADOOP_DAEMON_DETACHED" = "true" ]; then
 9        unset _HADOOP_DAEMON_DETACHED
10        touch $_HADOOP_DAEMON_OUT
11        nohup $_JAVA_EXEC -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS -classpa    th "$CLASSPATH" $CLASS "$@" > "$_HADOOP_DAEMON_OUT" 2>&1 < /dev/null &
12        if [ "$EUID" == "0" ]; then
13          chown $_HADOOP_DAEMON_USER $_HADOOP_DAEMON_OUT
14        fi
15        echo $! > "$_HADOOP_DAEMON_PIDFILE"
16        sleep 1
17        head "$_HADOOP_DAEMON_OUT"
18      else
19    exec $_JAVA_EXEC -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS -classpat    h "$CLASSPATH" $CLASS "$@"
20      fi
21    ;;


ここまですべてのスクリプトが実行され,残りはモードを認識できないエラー処理とプロンプトである.特定のコマンドを実行するときに、suはlinux上のユーザー名に従って実行するユーザー名を指定するなど、ユーザー名の検出に関連する可能性があります.
第七節 hadoop-config.shとhadoop-env.shスクリプト
     この2つのスクリプトは、基本的に上で分析されたすべてのスクリプトに関連しています.彼らの主な機能は、コマンドラインパラメータに基づいて、いくつかのプロファイルのパスが環境変数の値であり、共通の設定であるため、各スクリプトを実行するときに1回設定することです.具体的なコードは詳しく分析しません!
 
第八節 まとめ
      この起動スクリプトはまだ複雑で、この起動スクリプトから私は多くの知識を学んで、第一にshellプログラミングに関する多くの知識を学んで、中の多くのshellプログラミングの技巧は学習と参考に値します;第二に、起動プロセス全体の理解を通じて、hadoopを実行するために設定する必要がある多くのものを知っています.私たちがプロファイルで構成したいくつかのオプションがどのように機能しているのか、どのclasspathパスを設定しているのかなどが含まれています.第三に、hadoopで実行できるすべてのコマンドを詳しく知っています.他にも多くの収穫が言わないうちにあった.
 
参照が終了しました.
以上の分析に基づいて、namenodeの起動クラスorg.apache.hadoop.hdfs.server.namenodeを変更します.
  /**
   */
  public static void main(String argv[]) throws Exception {
	 LOG.info("  namenode...");
    try {
      StringUtils.startupShutdownMessage(NameNode.class, argv, LOG);
      NameNode namenode = createNameNode(argv, null);
      if (namenode != null)
        namenode.join();
    } catch (Throwable e) {
      LOG.error(StringUtils.stringifyException(e));
      System.exit(-1);
    }
  }

 mainメソッドで1行のログを印刷するだけです.$hadoop/hadoop-**-core.jarの対応するクラスをこのクラスのclassで置き換えます.さらにstart-all.shを使用すると、namenodeのログファイルhadoop-Administrator-namenode-**.logの出力が表示されます.
 
 
 
2012-02-13 17:56:34,906 INFO org.apache.hadoop.hdfs.server.namenode.NameNode:   namenode...
2012-02-13 17:56:34,937 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: STARTUP_MSG: 

 
ほほほ、とても簡単なデバッグで、ただ1つの始まりで、hadoopのすべての機能を同じ方法でデバッグすることができます.