hadoop学習5-start-all.shからソースコードをデバッグ
52803 ワード
hadoop0.20.2
ほかのところを参照してください.
第1節 start-all.shスクリプト
このスクリプトは簡単です.このスクリプトを実行したディレクトリに基づいてhadoopディレクトリをインストールするbinディレクトリに入り、hdfsとmapredを起動する起動スクリプトを実行します.
第2節 Start-dfs.shスクリプト
このスクリプトは、まずパラメータが含まれているかどうかを確認します.コードは次のとおりです.
以上のコードから、このスクリプトはupgradeとrollbackの2つのオプションパラメータのみをサポートしています.1つのパラメータはファイルシステムを更新するために使用され、もう1つはファイルシステムをロールバックするために使用されます.
次に、namenode、datanode、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未満であるかどうかを判断します.小さい場合は、このスクリプトを使用するヘルプを印刷します.shellコードは次のとおりです.
その後、hadoop-config.shスクリプトを他のスクリプトと同様に実行し、関連する環境変数をチェックして設定します.このスクリプトでは、hadoop-config.shスクリプトの役割は、プロファイルとホストリストのファイルを処理し、対応する環境変数を設定して保存することです.
次に、起動または停止のコマンドと関連パラメータを保存します(shiftのshellスクリプトの役割は、shellスクリプトに含まれるパラメータを1つ前に移動することです).
次に、ログをスクロールするための関数を定義します.詳細は分析されません.後述する環境変数は、コンフィギュレーションファイルのコンフィギュレーションオプションに基づいて設定されます.これらの環境変数は、スケジューリング優先度のある環境変数など、namenodeを具体的に起動するために使用されます.
最後に、コマンドに従ってnamenodeの起動停止(startまたはstop)を制御します.具体的なコードは以下の通りです.
startがnamenodeを起動するコマンドである場合は、まずpidファイルを格納するディレクトリを作成し、pidを格納するファイルがすでに存在する場合はnamenodeノードがすでに実行されていることを示す説明があれば、まず起動を停止します.次にログスクロール関数に基づいてログファイルを生成し、最後にniceでスケジューリング優先度に基づいてnamenodeを起動しますが、最終的な起動には別のスクリプトhadoopがあります.このスクリプトはすべてのノードを起動する究極のスクリプトで、main関数付きクラスを選択してjavaで起動し、javaデーモンプロセスを本格的に起動する効果があります.このスクリプトは起動のポイントであり、hadoopソースコードを分析する入り口でもあるので、後の章で重点的に分析します.
stopコマンドであれば簡単な停止コマンドを実行しますが、その他はエラーで、このスクリプトを使用するドキュメントを印刷するプロンプトが表示されます.
第四節 hadoop-daemons.shとslaves.shスクリプト
このスクリプトは簡単です.彼は最後に前節で紹介したスクリプトによって起動したからです.ただ、その前にいくつかの特殊な処理をしただけで、別のスクリプトslaves.shを実行します.コードは以下の通りです.
Slaves.shスクリプトの主な機能は、sshによってすべてのノードから起動する起動スクリプトを実行することであり、上のコードの最後の2つのコマンドであり、hadoopのディレクトリに入ってbinディレクトリの下のhadoop-daemon.shスクリプトを実行することである.この機能を実行するコードは次のとおりです.
以上のコードは、まず、ノードからのすべてのホスト名(slavesファイル、またはプロファイルに構成されている)を見つけ、forループを介してsshリモートバックグラウンドで起動スクリプトプログラムを順次実行し、プログラムが完了するまで待機してshellスクリプトを終了します.
したがって、このスクリプトの主な機能は、ノードから対応するノードを起動するすべてのスクリプトを実行することです.このスクリプト実行datanodeはslavesファイルからdatanodeノードを見つけ、secondarynamenodeはmasterファイルでノードホストを見つけます(start-dfs.shスクリプトで-hosts マスターが指定します.そうしないと、デフォルトでslavesファイルが見つかります.datanodeはデフォルトで見つかります).
第五節 start-mapred.shスクリプト
このスクリプトは2つの重要なコードについて、jobtrackerノードとtasktrackerノードをそれぞれ起動し、他の環境変数は対応するスクリプトで設定されます.以下のようにします.
コードから分かるように、前節と同じ方法で起動するか、具体的には分析されていません.前節を見てください.
第六節 hadoopスクリプト
このスクリプトこそがポイントで、前のスクリプト実行はすべてこのスクリプト実行のために敷き詰められています.このスクリプトの機能もかなり強く、各ノードのサービスを起動するだけでなく、多くのコマンドやツールを実行することができます.各ノード・サービスの起動を含む、受信したパラメータに基づいてどのような機能を実行するかを決定します.このスクリプトの実行プロセスと機能について詳しく説明します.
ステップ1:binディレクトリに切り替えてスクリプトhadoop-config.shを実行します.コードは次のとおりです.
ステップ2:hadoop実行インスタンスの名前とhadoopを実行する環境がwindowsの下のlinuxシミュレーション環境cygwinであるかどうかを検出します.コードは以下の通りです.
ステップ3:パラメータの個数が0個であるかどうかを判断し、そうであればプリントスクリプトの使用方法を判断して終了し、そうでなければ具体的なコマンドを獲得し、コマンドのコードを獲得するのは以下の通りである.
ステップ4:プロファイルが存在するディレクトリの下にhadoop-env.shスクリプトがあるかどうかを判断し、実行します.コードは以下の通りです.
ステップ5:java実行に関するパラメータ(例えばJAVA_HOME変数、jvmを実行する最大スタックスペースなど、コードは以下の通りです.
ステップ6:CLASSSPATHを設定するには、設定しないと多くのクラスが見つからない可能性があります.CLASSSPATHにパスを設定するには、次のコードを参照してください.
上のコードは大きく省略されていますが、具体的には具体的なhadoopスクリプトを見ることができます.
ステップ7:ステップ3で保存したコマンドに基づいて、次のように対応する起動javaクラスを選択します.
具体的には、それらのコマンドを実行することができます以上のコードから完全に見ることができ、どのコマンドを実行するか、どのクラスに具体的に対応するかが明確に対応しています.特定の機能のコードを分析するときに、エントリポイントを見つけることができます.上のコードの最後の2行目からhadoopスクリプトもjavaのjarパッケージやクラスを直接実行することができ、開発者が自分で開発したhadoopプラットフォームに基づくプログラムをテストするのに便利で、スクリプトが多くの知識を学ぶように見えます.
ステップ8:cygwin環境でパスを変換する必要がある場合、コードは次のとおりです.
ステップ9:java実行に必要なローカルライブラリパスJAVA_を設定するLIBRARY_PATH、具体的なコードは以下の通りです.
ステップ10:hadoopオプション変数の設定:HADOOP_OPTS;
ステップ11:まず、実行ノードの起動ノード実行コマンドか通常のクライアントコマンドかを判断し、関連条件に基づいて実行モードを設定します(jvsc、su、normalの3種類があります).コードは以下の通りです.
ステップ12:最後のステップは、上記の実行モードに基づいてコマンドを具体的に実行することです.datanodeノードだけがjsvcを使用して実行できます.次のコードに示します.
suモードとnormalモードで実行されている場合、すべてのコマンドはjavaを使用して正常に実行できます.次のコードがあります.
ここまですべてのスクリプトが実行され,残りはモードを認識できないエラー処理とプロンプトである.特定のコマンドを実行するときに、suはlinux上のユーザー名に従って実行するユーザー名を指定するなど、ユーザー名の検出に関連する可能性があります.
第七節 hadoop-config.shとhadoop-env.shスクリプト
この2つのスクリプトは、基本的に上で分析されたすべてのスクリプトに関連しています.彼らの主な機能は、コマンドラインパラメータに基づいて、いくつかのプロファイルのパスが環境変数の値であり、共通の設定であるため、各スクリプトを実行するときに1回設定することです.具体的なコードは詳しく分析しません!
第八節 まとめ
この起動スクリプトはまだ複雑で、この起動スクリプトから私は多くの知識を学んで、第一にshellプログラミングに関する多くの知識を学んで、中の多くのshellプログラミングの技巧は学習と参考に値します;第二に、起動プロセス全体の理解を通じて、hadoopを実行するために設定する必要がある多くのものを知っています.私たちがプロファイルで構成したいくつかのオプションがどのように機能しているのか、どのclasspathパスを設定しているのかなどが含まれています.第三に、hadoopで実行できるすべてのコマンドを詳しく知っています.他にも多くの収穫が言わないうちにあった.
参照が終了しました.
以上の分析に基づいて、namenodeの起動クラスorg.apache.hadoop.hdfs.server.namenodeを変更します.
mainメソッドで1行のログを印刷するだけです.$hadoop/hadoop-**-core.jarの対応するクラスをこのクラスのclassで置き換えます.さらにstart-all.shを使用すると、namenodeのログファイルhadoop-Administrator-namenode-**.logの出力が表示されます.
ほほほ、とても簡単なデバッグで、ただ1つの始まりで、hadoopのすべての機能を同じ方法でデバッグすることができます.
ほかのところを参照してください.
第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のすべての機能を同じ方法でデバッグすることができます.