Amazon EMR クラスターで NameNode サービスのセーフモードをオフにするにはどうすればよいですか?

最終更新日: 2021 年 9 月 3 日

Amazon EMR クラスターで Apache Hadoop または Apache Spark ジョブを実行しようとすると、次のいずれかのエラーメッセージが表示されます。

  • 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 を取得したいと考えています。

簡単な説明

NameNode のセーフモードは、基本的に Hadoop Distributed File System (HDFS) クラスターの読み取り専用モードです。NameNode は、次のようなさまざまな理由でセーフモードに入る場合があります。

  • 使用可能な領域が、NameNode ストレージディレクトリで必要な領域よりも少なくなります。NameNode ディレクトリに必要な領域の量は、パラメータの dfs.namenode.resource.du.reserved で定義されます。
  • NameNode は FsImageEditLog をメモリにロードできません。
  • NameNode は DataNode からブロックレポートを受信しませんでした。

NameNode ログをチェックして、ログの場所の /var/log/hadoop-hdfs/ で問題の根本原因を見つけます。

解決方法

ユースケースに基づいて、次のトラブルシューティングオプションを 1 つ以上試してください。

複数のマスターノードを持つクラスターに切り替える

単一のマスターノードを持つクラスターでは、チェックポイントは自動的ではありません。つまり、HDFS 編集ログは新しいスナップショット (FsImage) にバックアップされず、削除されません。HDFS は編集ログを使用して、スナップショット間のファイルシステムの変更を記録します。単一のマスターノードを持つクラスターがあり、編集ログをマニュアルで削除しない場合、これらのログは最終的に in/mnt のディスク容量をすべて使用する可能性があります。この問題を解決するには、複数のマスターノードを持つクラスターを起動します。複数のマスターノードを持つクラスターは、HDFS NameNode の高可用性をサポートし、チェックポイントの問題を解決します。詳細については、「マスターノードを計画して設定する」を参照してください。

不要なファイルを /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 から不要なファイルを削除します。例えば、マスターノードが 1 つあるクラスターで、/mnt/namenode/current 内のディレクトリが大量の領域を使用している場合、新しいスナップショット (FsImage) を作成し、古い編集ログを削除できます。

次のスクリプト例では、新しいスナップショットを生成し、古い編集ログを Amazon Simple Storage Service (Amazon S3) バケットにバックアップし、編集ログを削除します。スクリプトは、進行中の編集のログを削除しません。次のスクリプトを hadoop ユーザーとして実行します。

#!/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.    ディスク容量を占有しているファイル/フォルダを特定したならば、これらのファイルを削除することを選択します。不要になったファイルのみを削除してください。削除の候補として、すでに Amazon S3 ロギングバケットにバックアップされている /mnt/var/log/hadoop-hdfs/ および /mnt/var/log/hadoop-yarn/ の圧縮ログファイルがあります。

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

HDFS ユーザーガイドの Hadoop ドキュメント

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?