Amazon EMR クラスターで NameNode サービスのセーフモードをオフにするにはどうすればよいですか?
Amazon EMR クラスターで Apache Hadoop または Apache Spark ジョブを実行しようとすると、NameNode サービスがセーフモードになります。セーフモードをオフにしようとしましたが、すぐにオンに戻ります。NameNode をセーフモードから解除したいと考えています。
簡単な説明
Amazon EMR クラスターで Apache Hadoop または Apache Spark ジョブを実行すると、次のいずれかのエラーメッセージが表示される場合があります。
「Cannot create file/user/test.txt._COPYING_.Name node is in safe mode.」(file/user/test.txt._COPYING_ を作成できません。名前ノードはセーフモードです。)
「org.apache.hadoop.hdfs.server.namenode.SafeModeException: /user/hadoop/.sparkStaging/application_15xxxxxxxx_0001 を削除できません。名前ノードはセーフモードです。それはマニュアルでオンになりました。セーフモードをオフにするには、「hdfs dfsadmin -safemode leave」を使用してください。NamenodeHostName:ip-xxx-xx-xx-xx.ec2.internal」
NameNode のセーフモードは、Hadoop Distributed File System (HDFS) クラスターの読み取り専用モードです。セーフモードでは、ファイルシステムやブロックに変更を加えることはできません。ほとんどのファイルシステムブロックが使用可能であることを DataNodes が報告すると、NameNode は自動的にセーフモードを終了します。ただし、NameNode は次の理由でセーフモードになる場合があります。
- 使用可能な領域が、NameNode ストレージディレクトリで必要な領域よりも少ない。NameNode ディレクトリに必要な領域の量は、パラメータ dfs.namenode.resource.du.reserved で定義されます。
- NameNode は FsImage と EditLog をメモリにロードできない。
- NameNode は DataNode からブロックレポートを受信しなかった。
- クラスター内の一部のノードがダウンしている可能性がある。これにより、ノード上のブロックが使用できなくなります。
- 一部のブロックが破損している可能性がある。
NameNode のログの場所 /var/log/hadoop-hdfs/ で問題の根本原因を確認します。
解決方法
セーフモードを終了する前に、NameNode がセーフモードでスタックしている理由を認識し、理解していることを確認します。すべての DataNodes と NameNode のログのステータスを確認します。
重要: 場合によっては、セーフモードを手動でオフにすると、データが失われる可能性があります。
セーフモードを手動でオフにするには、次のコマンドを実行します。
sudo -u hdfs hadoop dfsadmin -safemode leave
エラーの根本原因に応じて、次の 1 つまたは複数のトラブルシューティングのステップを実行して、セーフモードをオフにします。
複数のプライマリノードを持つクラスターに切り替える
単一のプライマリノードを持つクラスターでは、チェックポイントは自動ではありません。これは、HDFS 編集ログが新しいスナップショット (FsImage) にバックアップされず、削除されないことを意味します。HDFS は編集ログを使用して、スナップショット間のファイルシステムの変更を記録します。プライマリノードが 1 つのクラスターから編集ログを手動で削除するのがベストプラクティスです。編集ログを手動で削除しないと、ログが /mnt のすべてのディスク領域を使用する可能性があります。この問題を解決するには、複数のプライマリノードを持つクラスターを起動します。複数のプライマリノードを持つクラスターは、HDFS NameNode のために高可用性をサポートします。NameNode のための高可用性は、チェックポイントの問題を解決します。
詳細については、「Plan and configure primary nodes」(プライマリノードを計画して設定する) を参照してください。
不要なファイルを /mnt から削除する
/mnt で使用できる最小ディスク領域は、dfs.namenode.resource.du.reserved パラメータで指定されます。/mnt のために使用できるディスク領域が dfs.namenode.resource.du.reserved で設定された値を下回る値になると、NameNode はセーフモードに入ります。dfs.namenode.resource.du.reserved のデフォルト値は 100 MB です。NameNode がセーフモードの場合、ファイルシステムやブロックの変更は許可されません。したがって、/mnt から不要なファイルを削除すると、問題の解決に役立つ場合があります。
不要になったファイルを削除するには、次のステップを実行します。
1. SSH を使用してプライマリノードに接続します。
2. NameNode のログをチェックして、ディスク領域が不足しているために NameNode がセーフモードになっていることを確認します。これらのログは /var/log/hadoop-hdfs にあります。ディスク領域が十分であれば、ログは次のようになる場合があります。
2020-08-28 19:14:43,540 WARN org.apache.hadoop.hdfs.server.namenode.NameNodeResourceChecker (org.apache.hadoop.hdfs.server.namenode.FSNamesystem$NameNodeResourceMonitor@5baaae4c): Space available on volume '/dev/xvdb2' is 76546048, which is below the configured reserved amount 104857600
ディスク領域が不十分であれば、ログは次のようになる場合があります。
2020-09-28 19:14:43,540 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem (org.apache.hadoop.hdfs.server.namenode.FSNamesystem$NameNodeResourceMonitor@5baaae4c): NameNode low on available disk space. Already in safe mode.
3. 次のコマンドを実行して、NameNode がまだセーフモードであることを確認します。
[root@ip-xxx-xx-xx-xxx mnt]# hdfs dfsadmin -safemode get Safe mode is ON
4. /mnt から不要なファイルを削除します。
ディレクトリ in/mnt/namenode/current が、1 つのプライマリノードを持つクラスターで大量のスペースを使用している場合は、新しいスナップショット (FsImage) を作成します。その後、古い編集ログを削除します。
例えば、次のアクションを実行するスクリプトを実行します。
新しいスナップショットを生成します。
古い編集ログを Amazon Simple Storage Service (Amazon S3) バケットにバックアップします。
編集ログを削除します。
スクリプト例:
#!/bin/bash hdfs dfsadmin -safemode enter hdfs dfsadmin -saveNamespace sudo su - root -c "hdfs dfs -put /mnt/namenode/current/*edits_[0-9]* s3://doc-example-bucket/backup-hdfs/" sudo su - root -c "rm -f /mnt/namenode/current/*edits_[0-9]*" sudo su - root -c "rm -f /mnt/namenode/current/seen*" hdfs dfsadmin -safemode leave
注: 前述のスクリプトは、進行中の編集のログを削除しません。
5. /mnt で使用可能なディスク領域の量を確認します。使用可能な領域が 100 MB を超える場合は、セーフモードのステータスをもう一度確認します。その後、セーフモードをオフにします。
[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode get Safe mode is ON [hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode leave Safe mode is OFF
/mnt の使用可能領域が 100 MB 未満の場合は、次のいずれかのアクションを実行します。
- さらにファイルを削除します。
- /mnt ボリュームのサイズを大きくします。
さらにファイルを削除する
1. SSH を使用してプライマリノードに接続します。
2. /mnt ディレクトリに移動します。
cd /mnt
3. ディスク容量が最も多く使用されているフォルダを特定します。
sudo du -hsx * | sort -rh | head -10
4. ディスク領域の問題の原因が見つかるまで、調査を続けます。例えば、var フォルダが大量のディスク領域を使用している場合は、var 内の最大のサブフォルダをチェックします。
cd var sudo du -hsx * | sort -rh | head -10
5. ディスク領域を多く使用しているファイルフォルダを特定したら、これらのファイルを削除します。不要になったファイルのみを削除してください。/mnt/var/log/hadoop-hdfs/ と /mnt/var/log/hadoop-yarn/ にある圧縮されたログファイルは、既に Amazon S3 ログ記録バケットにバックアップされています。これらのログファイルは、削除候補として適しています。
6. 不要なファイルを削除したら、セーフモードの状態をもう一度確認します。その後、セーフモードをオフにします。
[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode get Safe mode is ON [hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode leave Safe mode is OFF
破損しているか、または欠落しているブロック/ファイルがないか確認する
1. 次のコマンドを実行すると、クラスターの状態を確認するのに役立つレポートが表示されます。レポートには、レプリケート不足のブロックのパーセンテージと、欠落しているレプリカの数も表示されます。
hdfs fsck /
2. リスト内の各ファイルについて、次のコマンドを実行して、ファイルの各ブロックの DataNode を見つけます。
hdfs fsck example_file_name -locations -blocks -files
注: example_file_name を自分のファイル名に置き換えてください。
次のようなメッセージが表示されます。
0. BP-762523015-192.168.0.2-1480061879099:blk_1073741830_1006 len=134217728 MISSING! 1. BP-762523015-192.168.0.2-1480061879099:blk_1073741831_1007 len=134217728 MISSING! 2. BP-762523015-192.168.0.2-1480061879099:blk_1073741832_1008 len=70846464 MISSING!
前述のメッセージから、ブロックが保存されている DataNode を見つけることができます。例えば、「192.168.0.2」です。 その後、その DataNode のログを参照して、ブロック ID (blk_xxx) に関連するエラーを検索できます。ノードは頻繁に終了し、その結果としてブロックが欠落します。
3. 破損したファイルを削除するには、セーフモードを終了します。その後、次のコマンドを実行します。
hdfs dfs -rm example_file_name
注: example_file_name を自分のファイル名に置き換えてください。
CloudWatch メトリクスを使用して、HDFS の状態をモニタリングする
次の Amazon CloudWatch メトリクスは、NameNode がセーフモードに移行する潜在的な原因をモニタリングするのに役立ちます。
- HDFSUtilization: 使用されている HDFS ストレージのパーセンテージ。
- MissingBlocks: HDFS にレプリカがないブロックの数。これらは破損したブロックである可能性があります。
- UnderReplicatedBlocks: 1 回以上レプリケートする必要があるブロックの数。
関連情報
HDFS ユーザーガイド (Apache Hadoop のウェブサイトから)
関連するコンテンツ
- 質問済み 7年前lg...
- AWS公式更新しました 3年前
- AWS公式更新しました 3年前