この記事では、シェルスクリプトを使用してHadoopのNameNodeとDataNodeを一括で起動および停止する方法を紹介します。シンプル版と、より高度な機能を備えた拡張版の2種類を提供します。拡張版は、より多くの状態チェックと情報表示を追加しています。スクリプトを再利用する場合は、以下の点に注意してください。
1. HADOOP_HOME変数を自身のHadoopインストールパスに変更します。
2. スクリプトの実行権限を700以上に設定します。
拡張版を再利用する場合は、上記に加えて以下の点も確認してください。
1. propertiesファイルとact.shファイルは同じディレクトリに配置してください。
2. そのディレクトリとスクリプトの実行権限を700以上に設定してください。
**シンプル版:一括起動/停止/再起動**
**拡張版:一括起動/停止/再起動**
**propertiesスクリプト(変数と関数)**
**act.sh(メインスクリプト)**
#!/bin/bash
# Hadoopのインストールディレクトリとコマンドパス
HADOOP_ROOT="/opt/hadoop"
HADOOP_BIN_DIR="${HADOOP_ROOT}/sbin"
# ユーザー入力を検証する正規表現
input_pattern='^[1-3]$'
# ユーザーの入力をループで確認
operation=0
while [ ${operation} -eq 0 ]
do
echo ""
echo -e "このスクリプトで実行する操作を選択してください:
\t1). Hadoopを起動
\t2). Hadoopを停止
\t3). Hadoopを再起動"
read -p "選択してください:[1,2,3] > " user_choice
echo ""
if [[ ${user_choice} =~ ${input_pattern} ]]; then
case ${user_choice} in
1)
${HADOOP_BIN_DIR}/hadoop-daemon.sh start namenode
${HADOOP_BIN_DIR}/hadoop-daemon.sh start datanode
echo "Hadoopの起動が完了しました。"
echo ""
exit 0
;;
2)
${HADOOP_BIN_DIR}/hadoop-daemon.sh stop datanode
${HADOOP_BIN_DIR}/hadoop-daemon.sh stop namenode
echo "Hadoopの停止が完了しました。"
echo ""
exit 0
;;
3)
${HADOOP_BIN_DIR}/hadoop-daemon.sh stop datanode
${HADOOP_BIN_DIR}/hadoop-daemon.sh stop namenode
${HADOOP_BIN_DIR}/hadoop-daemon.sh start namenode
${HADOOP_BIN_DIR}/hadoop-daemon.sh start datanode
echo "Hadoopの再起動が完了しました。"
echo ""
exit 0
;;
esac
else
echo "無効な入力です。1、2、または3を入力してください。"
fi
done
#!/bin/bash
# Hadoopのインストールディレクトリとコマンドパス
HADOOP_ROOT="/opt/hadoop"
HADOOP_BIN_DIR="${HADOOP_ROOT}/sbin"
# ユーザー入力を検証する正規表現
input_pattern='^[1-2]$'
# NameNodeを起動し、標準出力を抑制する
start_namenode() {
echo "NameNodeの起動を開始します。"
${HADOOP_BIN_DIR}/hadoop-daemon.sh start namenode &>/dev/null
if [ $? -eq 0 ]; then
echo ""
pid=$(get_namenode_pid)
echo "NameNodeの起動に成功しました。プロセスID: ${pid}"
else
echo ""
echo "NameNodeの起動に失敗しました。原因を確認してください。"
exit 1
fi
}
# DataNodeを起動し、標準出力を抑制する
start_datanode() {
local pid=$(get_datanode_pid)
if [ -z "${pid}" ]; then
echo ""
echo "DataNodeを起動しています。"
${HADOOP_BIN_DIR}/hadoop-daemon.sh start datanode &>/dev/null
if [ $? -eq 0 ]; then
echo ""
echo "DataNodeの起動に成功しました。"
echo ""
echo "状態レポート:"
echo "NameNode起動成功、プロセスID: $(get_namenode_pid)"
echo "DataNode起動成功、プロセスID: $(get_datanode_pid)"
echo ""
exit 0
else
echo ""
echo "DataNodeの起動に失敗しました。原因を確認してください。"
exit 1
fi
else
echo ""
echo -e "このメッセージが表示される場合、スクリプトのエラーか、
予期せぬ何かが発生した可能性があります。"
exit 1
fi
}
# すでに起動しているNameNodeの処理
handle_running_namenode() {
local stop_choice=0
while [ ${stop_choice} -eq 0 ]
do
echo ""
local pid=$(get_namenode_pid)
echo "NameNodeはすでに起動しています。プロセスID: ${pid}。停止しますか?"
echo -e "\t1). NameNodeを停止して再起動
\t2). DataNodeの起動を続行"
echo ""
read -p "選択してください:[1/2] > " stop_choice_input
if [[ ${stop_choice_input} =~ ${input_pattern} ]]; then
case ${stop_choice_input} in
1)
stop_namenode
echo ""
echo "NameNodeを起動しています。"
${HADOOP_BIN_DIR}/hadoop-daemon.sh start namenode &>/dev/null
if [ $? -eq 0 ]; then
pid=$(get_namenode_pid)
echo ""
echo "NameNodeの起動に成功しました。プロセスID: ${pid}"
break
else
echo ""
echo "NameNodeの起動に失敗しました。原因を確認してください。"
exit 1
fi
;;
2)
start_datanode_if_needed
;;
esac
else
echo ""
echo "無効な数字です。1または2を入力してください。"
fi
done
}
# すでに起動しているDataNodeの処理
handle_running_datanode() {
local action=0
while [ $action -eq 0 ]
do
echo ""
echo -e "DataNodeはすでに起動しています。どのように処理しますか?:
\t1). DataNodeを再起動
\t2). DataNodeを再起動しない"
echo ""
read -p "選択してください:[1/2] > " action_input
if [[ ${action_input} =~ ${input_pattern} ]]; then
case ${action_input} in
1)
stop_datanode
start_datanode
exit 0
;;
2)
echo ""
echo "状態レポート:"
echo "NameNode起動成功、プロセスID: $(get_namenode_pid)"
echo "DataNode起動成功、プロセスID: $(get_datanode_pid)"
echo ""
exit 0
;;
esac
fi
done
}
# NameNodeを停止し、標準出力を抑制する
stop_namenode() {
local pid=$(get_namenode_pid)
if [ -z "${pid}" ]; then
echo ""
echo -e "\033[40;35mNameNodeは不明な理由で停止しています。原因を確認してください!!!\033[0m"
echo -e "\033[40;37m \033[0m"
echo "NameNodeとDataNodeは停止済みです。"
echo ""
exit 1
else
echo "NameNodeの停止を開始します。"
${HADOOP_BIN_DIR}/hadoop-daemon.sh stop namenode &>/dev/null
if [ $? -eq 0 ]; then
echo ""
echo "NameNodeの停止に成功しました。"
echo ""
echo "DataNodeとNameNodeの停止が完了しました。"
echo ""
exit 0
else
echo ""
echo "NameNodeの停止に失敗しました。プロセスID: $(get_namenode_pid)"
echo "NameNodeが停止できない原因を確認してください!!!"
echo ""
exit 1
fi
fi
}
# DataNodeを停止し、標準出力を抑制する
stop_datanode() {
local pid=$(get_datanode_pid)
if [ -z "${pid}" ]; then
echo ""
echo -e "\033[40;35mDataNodeは不明な理由で停止しています。原因を確認してください!!!\033[0m"
echo -e "\033[40;37m \033[0m"
stop_namenode
else
echo ""
echo "DataNodeの停止を開始します。"
${HADOOP_BIN_DIR}/hadoop-daemon.sh stop datanode &>/dev/null
if [ $? -eq 0 ]; then
echo ""
echo "DataNodeの停止に成功しました。"
else
echo ""
echo "DataNodeの停止に失敗しました!!!"
echo "失敗の原因を確認してください!!!"
exit 1
fi
fi
}
# DataNodeを必要に応じて起動する
start_datanode_if_needed() {
local pid=$(get_datanode_pid)
if [ -n "${pid}" ]; then
handle_running_datanode
else
start_datanode
fi
}
# NameNodeのプロセスIDを取得する
get_namenode_pid() {
local pid=$(jps | grep NameNode | awk '{print $1}')
echo ${pid}
}
# DataNodeのプロセスIDを取得する
get_datanode_pid() {
local pid=$(jps | grep DataNode | awk '{print $1}')
echo ${pid}
}
#!/bin/bash
# propertiesファイルを読み込み、関数と変数を利用可能にする
source ./properties
# ユーザーの入力をループで確認
main_loop=0
while [ $main_loop -eq 0 ]
do
# 欢迎メッセージの表示
echo ""
echo "Hadoopを起動しますか、それとも停止しますか?"
echo "1). Hadoopを起動"
echo "2). Hadoopを停止"
echo ""
read -p "選択してください:[1,2]> " user_input
echo ""
if [[ ${user_input} =~ ${input_pattern} ]]; then
case ${user_input} in
1)
echo ""
local namenode_pid=$(get_namenode_pid)
if [ -n "${namenode_pid}" ]; then
handle_running_namenode
echo ""
start_datanode_if_needed
else
start_namenode
start_datanode_if_needed
fi
;;
2)
stop_datanode
stop_namenode
local final_namenode_pid=$(get_namenode_pid)
local final_datanode_pid=$(get_datanode_pid)
if [ -z "${final_namenode_pid}" ] && [ -z "${final_datanode_pid}" ]; then
echo ""
echo "NameNodeとDataNodeの停止が完了しました。"
echo ""
exit 0
fi
;;
esac
else
echo ""
echo "無効な入力です。1または2を入力してください。"
fi
done