シェルスクリプトでNameNodeとDataNodeを一括起動・停止する

この記事では、シェルスクリプトを使用してHadoopのNameNodeとDataNodeを一括で起動および停止する方法を紹介します。シンプル版と、より高度な機能を備えた拡張版の2種類を提供します。拡張版は、より多くの状態チェックと情報表示を追加しています。スクリプトを再利用する場合は、以下の点に注意してください。 1. HADOOP_HOME変数を自身のHadoopインストールパスに変更します。 2. スクリプトの実行権限を700以上に設定します。 拡張版を再利用する場合は、上記に加えて以下の点も確認してください。 1. propertiesファイルとact.shファイルは同じディレクトリに配置してください。 2. そのディレクトリとスクリプトの実行権限を700以上に設定してください。 **シンプル版:一括起動/停止/再起動**
#!/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
**拡張版:一括起動/停止/再起動** **propertiesスクリプト(変数と関数)**
#!/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}
}
**act.sh(メインスクリプト)**
#!/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

タグ: Hadoop ShellScript NameNode DataNode クラスタ管理

8月8日 20:12 投稿