ローカルディスクを搭載したインスタンスファミリー (ローカル SSD を搭載した i シリーズやビッグデータインスタンスファミリー d シリーズなど) 上に構築された E-MapReduce (EMR) クラスターを使用している場合、ローカルディスクが破損したという通知を受け取ることがあります。このトピックでは、クラスター内の破損したローカルディスクを交換する方法について説明します。
注意事項
この問題を解決するには、異常なノードを削除し、新しいノードを追加します。この方法により、ビジネス運用への長期的な影響を防ぐことができます。
ディスク交換後、元のディスク上のデータは失われます。続行する前に、データに十分なレプリカ数があり、バックアップされていることを確認してください。
ディスク交換プロセスには、サービスの停止、ディスクのアンマウント、新しいディスクのマウント、およびサービスの再起動が含まれます。交換は通常 5 営業日以内に完了します。このトピックの手順を実行する前に、サービスの停止中に、サービスのディスク使用率とクラスターの負荷がビジネス運用をサポートできるかどうかを評価してください。
手順
ECS コンソールにログインして、イベントの詳細を表示します。詳細には、インスタンス ID、ステータス、破損したディスク ID、イベントの進捗、関連する操作が含まれます。
ステップ 1:破損したディスクに関する情報の取得
Secure Shell (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 コンソールで、破損したディスクを含むクラスターをクリックします。[クラスターサービス] タブで、破損したディスクの読み取りまたは書き込みを行う EMR サービスを見つけます。これらのサービスには通常、HDFS、HBase、Kudu などのストレージサービスが含まれます。対象サービスのエンドポイントがデプロイされているエリアで、 を選択してサービスを停止します。
次のコマンドを実行して、関連する管理プロセスを停止します。
sudo crontab -l | grep -v "exporter_check.sh" | sudo crontab -
sudo service taihao_exporter stop
sudo service ilogtaild stop
sudo service ilogtaildclt stop
注:これらの管理プロセスを停止すると、ノードのメトリック収集とログ監視機能が影響を受けます。これらの機能は、ディスクが交換され、プロセスが再起動されると自動的に回復します。
また、ノードで 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 の場合、そのディスクのレコードを削除します。
停止したアプリケーションを開始できます。
破損したディスクのあるクラスターの [クラスターサービス] タブで、ステップ 2 で停止した EMR サービスを見つけます。 次に、各サービスについて、エンドポイントがデプロイされているエリアで、 を選択します。
手順 3:ディスクを交換する
ステップ 4:ディスクのマウント
ディスクが修復されたら、マウントして新しいディスクとして使用します。
次のコマンドを実行して、デバイス名を正規化します。
device_name=`echo "$device_name" | sed 's/x//1'`
このコマンドはデバイス名を正規化します。たとえば、/dev/xvdk のようなデバイス名は /dev/vdk に変更されます。
次のコマンドを実行して、マウントディレクトリを作成します。
次のコマンドを実行して、ディスクをマウントします。
mount $device_name $mount_path;sudo chmod 755 $mount_path
ディスクのマウントに失敗した場合は、次の手順を実行します。
次のコマンドを実行して、ディスクをフォーマットします。
fdisk $device_name << EOF
n
p
1
wq
EOF
次のコマンドを実行して、ディスクを再度マウントします。
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 に設定します。
スクリプトファイルを作成し、クラスタータイプに基づいてスクリプトコードを選択します。
DataLake、DataFlow、OLAP、DataServing、および Custom クラスター
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
データレイク (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
次のコマンドを実行してスクリプトファイルを実行し、サービスフォルダーを作成してから、スクリプトを削除します。$file_path はスクリプトファイルへのパスです。
chmod +x $file_path
sudo $file_path -p $mount_path
rm $file_path
新しいディスクを使用します。
EMR コンソールで、ノードで実行されているサービスを再起動します。
次のコマンドを実行して、管理プロセスを開始します。
sudo service taihao_exporter start
sudo service ilogtaild start
sudo service ilogtaildclt start
(sudo crontab -l; echo "*/5 * * * * bash /usr/local/taihao_exporter/exporter_check.sh") | sudo crontab -
ディスクが正しく動作していることを確認します。