i シリーズや d シリーズなど、ローカルディスクを備えたインスタンスファミリーで構築された E-MapReduce (EMR) クラスターを使用している場合、ローカルディスクの障害が通知されることがあります。本トピックでは、クラスター内の破損したローカルディスクを交換する方法について説明します。
注意事項
-
長時間のサービス中断を避けるため、障害が発生したノードを交換することを推奨します。障害が発生したディスクを持つノードをデコミッションし、新しいノードをクラスターに追加できます。
-
交換したディスク上のデータは失われます。開始する前に、データに十分なレプリカがあるか、またはバックアップされているかを確認してください。
-
交換プロセスには、サービスの停止、ディスクのアンマウント、新しいディスクのマウント、およびサービスの再起動が含まれます。このプロセスには通常、最大 5 営業日かかります。続行する前に、サービスの停止中に、残りのディスク領域とクラスターのワークロードで業務を維持できるかどうかを評価してください。
操作手順
ECS コンソールにログインして、インスタンス ID、ステータス、破損したディスク ID、イベントの進捗状況、関連する操作などのイベント詳細を表示します。
ステップ1:破損したディスク情報の取得
-
SSH を使用して、破損したディスクがあるノードにログインします。詳細については、「クラスターへのログイン」をご参照ください。
-
次のコマンドを実行して、ブロックデバイス情報を表示します。
lsblk
コマンドの出力は、次の例のようになります。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdd 254:48 0 5.4T 0 disk /mnt/disk3
vdb 254:16 0 5.4T 0 disk /mnt/disk1
vde 254:64 0 5.4T 0 disk /mnt/disk4
vdc 254:32 0 5.4T 0 disk /mnt/disk2
vda 254:0 0 120G 0 disk
└─vda1 254:1 0 120G 0 part /
-
次のコマンドを実行して、ディスク情報を表示します。
sudo fdisk -l
コマンドの出力は、次の例のようになります。
Disk /dev/vdd: 5905.6 GB, 5905580032000 bytes, 11534336000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
-
前の 2 つのステップの出力に基づいて、デバイス名を $device_name として、マウントポイントを $mount_path として記録します。
例えば、障害が発生したディスクデバイスが vdd の場合、デバイス名は /dev/vdd で、マウントポイントは /mnt/disk3 です。
ステップ2:破損したローカルディスクの分離
-
破損したディスクを読み書きするすべてのアプリケーションを停止します。
EMR コンソールで、障害が発生したディスクがあるクラスターに移動します。Services タブで、HDFS、HBase、Kudu など、ディスクを使用するサービスを見つけます。サービスのアクション列で、 を選択します。
または、ノードで sudo fuser -mv $device_name コマンドを実行して、ディスクを使用するすべてのプロセスを一覧表示します。その後、EMR コンソールで対応するサービスを停止します。
-
次のコマンドを実行して、ローカルディスクへの読み書き操作を禁止します。
sudo chmod 000 $mount_path
-
次のコマンドを実行して、ローカルディスクをアンマウントします。
sudo umount $device_name;sudo chmod 000 $mount_path
重要
ディスクのアンマウントに失敗すると、修復後にデバイス名が変更され、アプリケーションが間違ったディスクに読み書きする可能性があります。
-
fstab ファイルを更新します。
-
既存の/etc/fstab ファイルをバックアップします。
-
/etc/fstab ファイルからディスクのエントリを削除します。
例えば、障害が発生したディスクが /dev/vdd の場合、そのディスクのエントリを削除する必要があります。
-
停止したサービスを再起動します。
クラスターの Services タブで、手順 2 で停止したサービスを探し、サービスの [操作] 列で を選択します。
ステップ3:ディスクの交換
ステップ4:ディスクのマウント
ディスクが修復された後、マウントして使用可能にします。
-
次のコマンドを実行して、デバイス名を正規化します。
device_name=`echo "$device_name" | sed 's/x//1'`
このコマンドは、/dev/xvdk のようなデバイス名から文字 x を削除して /dev/vdk に正規化します。
-
次のコマンドを実行して、マウントポイントディレクトリを作成します。
sudo mkdir -p "$mount_path"
-
次のコマンドを実行して、ディスクをマウントします。
sudo mount $device_name $mount_path;sudo chmod 755 $mount_path
ディスクのマウントに失敗した場合は、次の手順を実行します。
-
次のコマンドを実行して、ディスクをフォーマットします。
fdisk $device_name << EOF
n
p
1
wq
EOF
-
次のコマンドを実行して、ディスクを再マウントします。
sudo mount $device_name $mount_path;sudo chmod 755 $mount_path
-
次のコマンドを実行して、fstab ファイルを更新します。
echo "$device_name $mount_path $fstype defaults,noatime,nofail 0 0" >> /etc/fstab
説明
which mkfs.ext4 を実行して、ext4 がインストールされているかを確認します。インストールされている場合は、$fstype を ext4 に設定します。それ以外の場合は、$fstype を ext3 に設定します。
-
スクリプトファイルを作成し、お使いのクラスタータイプに応じたスクリプトを追加します。
データレイク (Hadoop) クラスター
while getopts p: opt
do
case "${opt}" in
p) mount_path=${OPTARG};;
esac
done
mkdir -p $mount_path/data
chown hdfs:hadoop $mount_path/data
chmod 1777 $mount_path/data
mkdir -p $mount_path/hadoop
chown hadoop:hadoop $mount_path/hadoop
chmod 775 $mount_path/hadoop
mkdir -p $mount_path/hdfs
chown hdfs:hadoop $mount_path/hdfs
chmod 755 $mount_path/hdfs
mkdir -p $mount_path/yarn
chown hadoop:hadoop $mount_path/yarn
chmod 755 $mount_path/yarn
mkdir -p $mount_path/kudu/master
chown kudu:hadoop $mount_path/kudu/master
chmod 755 $mount_path/kudu/master
mkdir -p $mount_path/kudu/tserver
chown kudu:hadoop $mount_path/kudu/tserver
chmod 755 $mount_path/kudu/tserver
mkdir -p $mount_path/log
chown hadoop:hadoop $mount_path/log
chmod 775 $mount_path/log
mkdir -p $mount_path/log/hadoop-hdfs
chown hdfs:hadoop $mount_path/log/hadoop-hdfs
chmod 775 $mount_path/log/hadoop-hdfs
mkdir -p $mount_path/log/hadoop-yarn
chown hadoop:hadoop $mount_path/log/hadoop-yarn
chmod 755 $mount_path/log/hadoop-yarn
mkdir -p $mount_path/log/hadoop-mapred
chown hadoop:hadoop $mount_path/log/hadoop-mapred
chmod 755 $mount_path/log/hadoop-mapred
mkdir -p $mount_path/log/kudu
chown kudu:hadoop $mount_path/log/kudu
chmod 755 $mount_path/log/kudu
mkdir -p $mount_path/run
chown hadoop:hadoop $mount_path/run
chmod 777 $mount_path/run
mkdir -p $mount_path/tmp
chown hadoop:hadoop $mount_path/tmp
chmod 777 $mount_path/tmp
その他のクラスター
while getopts p: opt
do
case "${opt}" in
p) mount_path=${OPTARG};;
esac
done
sudo mkdir -p $mount_path/flink
sudo chown flink:hadoop $mount_path/flink
sudo chmod 775 $mount_path/flink
sudo mkdir -p $mount_path/hadoop
sudo chown hadoop:hadoop $mount_path/hadoop
sudo chmod 755 $mount_path/hadoop
sudo mkdir -p $mount_path/hdfs
sudo chown hdfs:hadoop $mount_path/hdfs
sudo chmod 750 $mount_path/hdfs
sudo mkdir -p $mount_path/yarn
sudo chown root:root $mount_path/yarn
sudo chmod 755 $mount_path/yarn
sudo mkdir -p $mount_path/impala
sudo chown impala:hadoop $mount_path/impala
sudo chmod 755 $mount_path/impala
sudo mkdir -p $mount_path/jindodata
sudo chown root:root $mount_path/jindodata
sudo chmod 755 $mount_path/jindodata
sudo mkdir -p $mount_path/jindosdk
sudo chown root:root $mount_path/jindosdk
sudo chmod 755 $mount_path/jindosdk
sudo mkdir -p $mount_path/kafka
sudo chown root:root $mount_path/kafka
sudo chmod 755 $mount_path/kafka
sudo mkdir -p $mount_path/kudu
sudo chown root:root $mount_path/kudu
sudo chmod 755 $mount_path/kudu
sudo mkdir -p $mount_path/mapred
sudo chown root:root $mount_path/mapred
sudo chmod 755 $mount_path/mapred
sudo mkdir -p $mount_path/starrocks
sudo chown root:root $mount_path/starrocks
sudo chmod 755 $mount_path/starrocks
sudo mkdir -p $mount_path/clickhouse
sudo chown clickhouse:clickhouse $mount_path/clickhouse
sudo chmod 755 $mount_path/clickhouse
sudo mkdir -p $mount_path/doris
sudo chown root:root $mount_path/doris
sudo chmod 755 $mount_path/doris
sudo mkdir -p $mount_path/log
sudo chown root:root $mount_path/log
sudo chmod 755 $mount_path/log
sudo mkdir -p $mount_path/log/clickhouse
sudo chown clickhouse:clickhouse $mount_path/log/clickhouse
sudo chmod 755 $mount_path/log/clickhouse
sudo mkdir -p $mount_path/log/kafka
sudo chown kafka:hadoop $mount_path/log/kafka
sudo chmod 755 $mount_path/log/kafka
sudo mkdir -p $mount_path/log/kafka-rest-proxy
sudo chown kafka:hadoop $mount_path/log/kafka-rest-proxy
sudo chmod 755 $mount_path/log/kafka-rest-proxy
sudo mkdir -p $mount_path/log/kafka-schema-registry
sudo chown kafka:hadoop $mount_path/log/kafka-schema-registry
sudo chmod 755 $mount_path/log/kafka-schema-registry
sudo mkdir -p $mount_path/log/cruise-control
sudo chown kafka:hadoop $mount_path/log/cruise-control
sudo chmod 755 $mount_path/log/cruise-control
sudo mkdir -p $mount_path/log/doris
sudo chown doris:doris $mount_path/log/doris
sudo chmod 755 $mount_path/log/doris
sudo mkdir -p $mount_path/log/celeborn
sudo chown hadoop:hadoop $mount_path/log/celeborn
sudo chmod 755 $mount_path/log/celeborn
sudo mkdir -p $mount_path/log/flink
sudo chown flink:hadoop $mount_path/log/flink
sudo chmod 775 $mount_path/log/flink
sudo mkdir -p $mount_path/log/flume
sudo chown root:root $mount_path/log/flume
sudo chmod 755 $mount_path/log/flume
sudo mkdir -p $mount_path/log/gmetric
sudo chown root:root $mount_path/log/gmetric
sudo chmod 777 $mount_path/log/gmetric
sudo mkdir -p $mount_path/log/hadoop-hdfs
sudo chown hdfs:hadoop $mount_path/log/hadoop-hdfs
sudo chmod 755 $mount_path/log/hadoop-hdfs
sudo mkdir -p $mount_path/log/hbase
sudo chown hbase:hadoop $mount_path/log/hbase
sudo chmod 755 $mount_path/log/hbase
sudo mkdir -p $mount_path/log/hive
sudo chown root:root $mount_path/log/hive
sudo chmod 775 $mount_path/log/hive
sudo mkdir -p $mount_path/log/impala
sudo chown impala:hadoop $mount_path/log/impala
sudo chmod 755 $mount_path/log/impala
sudo mkdir -p $mount_path/log/jindodata
sudo chown root:root $mount_path/log/jindodata
sudo chmod 777 $mount_path/log/jindodata
sudo mkdir -p $mount_path/log/jindosdk
sudo chown root:root $mount_path/log/jindosdk
sudo chmod 777 $mount_path/log/jindosdk
sudo mkdir -p $mount_path/log/kyuubi
sudo chown kyuubi:hadoop $mount_path/log/kyuubi
sudo chmod 755 $mount_path/log/kyuubi
sudo mkdir -p $mount_path/log/presto
sudo chown presto:hadoop $mount_path/log/presto
sudo chmod 755 $mount_path/log/presto
sudo mkdir -p $mount_path/log/spark
sudo chown spark:hadoop $mount_path/log/spark
sudo chmod 755 $mount_path/log/spark
sudo mkdir -p $mount_path/log/sssd
sudo chown sssd:sssd $mount_path/log/sssd
sudo chmod 750 $mount_path/log/sssd
sudo mkdir -p $mount_path/log/starrocks
sudo chown starrocks:starrocks $mount_path/log/starrocks
sudo chmod 755 $mount_path/log/starrocks
sudo mkdir -p $mount_path/log/taihao_exporter
sudo chown taihao:taihao $mount_path/log/taihao_exporter
sudo chmod 755 $mount_path/log/taihao_exporter
sudo mkdir -p $mount_path/log/trino
sudo chown trino:hadoop $mount_path/log/trino
sudo chmod 755 $mount_path/log/trino
sudo mkdir -p $mount_path/log/yarn
sudo chown hadoop:hadoop $mount_path/log/yarn
sudo chmod 755 $mount_path/log/yarn
-
次のコマンドを実行してスクリプトを実行し、サービスディレクトリを作成してからスクリプトを削除します。$file_path をスクリプトファイルのパスに置き換えてください。
chmod +x $file_path
sudo $file_path -p $mount_path
rm $file_path
-
新しいディスクを使用します。
EMR コンソールで、ノード上のサービスを再起動し、ディスクが正しく動作していることを確認してください。