スキップしてコンテンツを表示

Amazon EMR クラスターの NameNode サービスのセーフモードを無効にする方法を教えてください。

所要時間3分
0

Amazon EMR クラスターで Apache Hadoop または Apache Spark ジョブを実行しようとすると、NameNode サービスがセーフモードになります。セーフモードをオフにしましたが、すぐにオンに戻ります。

簡単な説明

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

  • "Cannot create file/user/test.txt._COPYING_.Name node is in safe mode."
  • "org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /user/hadoop/.sparkStaging/application_15########_0001.Name node is in safe mode.It was turned on manually.Use "hdfs dfsadmin -safemode leave" to turn safe mode off.NamenodeHostName:ip-###-##-##-##.ec2.internal"

NameNode のセーフモードは、Hadoop 分散ファイルシステム (HDFS) クラスターの読み取り専用モードです。セーフモードでは、ファイルシステムやブロックを変更することはできません。

DataNodes がほとんどのファイルシステムブロックが使用可能であることを報告すると、NameNode は自動的にセーフモードを終了します。ただし、次の理由により NameNode が再びセーフモードになる場合があります。

  • 使用可能なスペースが、NameNode ストレージディレクトリに必要なスペースよりも少ない。dfs.namenode.resource.du.reserved パラメータによって、NameNode ディレクトリに必要なスペースが定義されている。
  • NameNode が FSImageEditLog をメモリにロードできない。
  • NameNode が DataNode からブロックレポートを受信しなかった。
  • クラスター内の一部のノードが停止し、ノード上のブロックが使用できない。
  • 一部のブロックが壊れている可能性がある。

問題の根本原因を NameNode ログの場所 (/var/log/hadoop-hdfs/) で確認してください。

解決策

セーフモードを終了する前に、NameNode がセーフモードのままになっている理由を確認してください。すべての DataNode ログと NameNode ログのステータスを確認してください。

重要: セーフモードを手動でオフにすると、データが失われる場合があります。

セーフモードを手動でオフにするには、次のコマンドを実行します。

sudo -u hdfs hadoop dfsadmin -safemode leave

エラーの根本原因に応じて、次の 1 つまたは複数のトラブルシューティング手順を実行して、セーフモードをオフにしてください。

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

プライマリノードが 1 つしかないクラスターでは、チェックポイントは自動的に行われません。そのため、HDFS は編集ログを新しいスナップショット (FSImage) にバックアップして自動的に削除することはできません。HDFS は編集ログを使用して、スナップショット間のファイルシステムの変更を記録します。プライマリノードが 1 つしかないクラスターから編集ログを手動で削除するのがベストプラクティスです。編集ログを手動で削除しないと、ログが /mnt 内のすべてのディスク容量を使用する可能性があります。この問題を解決するには、複数のプライマリノードを持つクラスターを起動します。複数のプライマリノードを持つクラスターは、HDFS NameNode の高可用性をサポートします。

/mnt から不要なファイルを削除する

dfs.namenode.resource.du.reserved パラメータは、/mnt の使用可能な最小ディスク容量を指定します。/mnt の使用可能なディスク容量が dfs.namenode.resource.du.reserved に設定されている値を下回ると、NameNode はセーフモードに入ります。dfs.namenode.resource.du.reserved のデフォルト値は 100 MB です。セーフモードがオンの場合、NameNode はすべてのファイルシステムとブロックの変更をブロックします。この問題を解決するには、/mnt から不要なファイルを削除する必要があります。

不要になったファイルを削除するには、次の手順を実行します。

  1. SSH を使用してプライマリノードに接続します

  2. NameNode ログをチェックして、ディスク容量が不足しているために NameNode がセーフモードになっていることを確認します。ディスク容量が十分にある場合、ログは次の例のようになります。

    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-###-##-##-### mnt]# hdfs dfsadmin -safemode getSafe mode is ON
  4. /mnt から不要なファイルを削除します。プライマリノードが 1 つのクラスタで、/mnt/namenode/current ディレクトリが大量のスペースを使用している場合は、新しいスナップショット (FSImage) を作成します。次に、古い編集ログを削除します。

  5. /mnt の使用可能なディスク容量を確認します。空き容量が 100 MB を超える場合は、セーフモードの状態をもう一度確認してください。

    [hadoop@ip-###-##-##-### ~]$ hdfs dfsadmin -safemode get

    出力例:

    Safe mode is ON
  6. セーフモードをオフにする:

    [hadoop@ip-###-##-##-### ~]$ hdfs dfsadmin -safemode leave

    出力例:

    Safe mode is OFF

**/mnt ** の空き容量がまだ 100 MB 未満の場合は、次の 1 つまたは複数のアクションを実行します。

さらにファイルを削除する

次の手順を実行します。

  1. SSH を使用してプライマリノードに接続します

  2. /mnt ディレクトリに移動します。

    cd /mnt
  3. ディスク容量を最も多く使用しているフォルダを特定します。

    sudo du -hsx * | sort -rh | head -10
  4. ディスク容量を最も多く使用しているフォルダ内の最も大きいサブフォルダを確認します。例えば、var フォルダが大量のディスク容量を使用している場合、var 内の最も大きいサブフォルダを確認します。

    cd varsudo du -hsx \* | sort -rh | head -10
  5. 一番大きいファイルを最初に削除します。不要になったファイルのみを削除するようにしてください。Amazon S3 ログ記録バケットには、/mnt/var/log/hadoop-hdfs//mnt/var/log/hadoop-yarn/ からの圧縮ログファイルのバックアップコピーが既に保存されています。これらのログファイルは安全に削除できます。

  6. 不要なファイルを削除したら、セーフモードの状態をもう一度確認してください。次に、セーフモードをオフにします。

    [hadoop@ip-###-##-##-### ~]$ hdfs dfsadmin -safemode get

    出力例:

    Safe mode is ON
  7. セーフモードをオフにする:

    [hadoop@ip-###-##-##-### ~]$ 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.2DataNode のログで、特定のブロック ID (blk_##) に関連するエラーがないかどうかを確認できます。
    注: ノードが予期せず終了したために、ブロックが欠落することがよくあります。
  3. 破損したファイルを削除するには、セーフモードを終了して次のコマンドを実行します。
    hdfs dfs -rm example_file_name
    注: example_file_name は実際のファイル名に置き換えてください。

CloudWatch メトリクスを使用して HDFS の状態をモニタリングする

次の Amazon CloudWatch メトリクスを使用して、NameNode がセーフモードに入る原因を特定します。

  • 使用されている HDFS ストレージの割合を確認するには、HDFSUtilization を確認します。
  • HDFS にレプリカがないブロックの数を確認するには、MissingBlocks を確認します。これらは壊れたブロックである可能性があります。
  • レプリケーションが必要なブロックの数を確認するには、UnderReplicatedBlocks を確認します。

関連情報

HDFS ユーザーガイド (Apache Hadoop のウェブサイト)

AWS公式更新しました 4ヶ月前
コメントはありません

関連するコンテンツ