跳至內容

如何在我的 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」

在 DataNode 回報大多數檔案系統區塊可用後,NameNode 會自動離開安全模式。不過,NameNode 可能因以下原因再次進入安全模式:

  • 可用空間小於 NameNode 儲存目錄所需的空間量。
  • NameNode 無法將 FsImageEditLog 載入記憶體。
  • NameNode 未收到來自 DataNode 的區塊報告。
  • 叢集中的部分節點可能已停止運作,導致這些節點上的區塊變為不可用。
  • 部分區塊可能已損毀。

解決方法

**重要:**在某些情況下,當您手動關閉安全模式時,可能會發生資料遺失。

若要手動關閉安全模式,請執行以下命令:

sudo -u hdfs hadoop dfsadmin -safemode leave

如果安全模式自動重新開啟,請在 /var/log/hadoop-hdfs/ 檢查 NameNode 日誌以確定根本原因。在您判斷原因後,請使用以下疑難排解步驟來解決問題。

切換到具有多個主要節點的叢集

在只有一個主要節點的叢集中,檢查點程序不會自動執行。因此,Hadoop 分散式檔案系統 (HDFS) 無法將編輯日誌備份到新的快照 (FsImage),也無法自動移除這些日誌。如果您的叢集只有一個主要節點,編輯日誌可能會用盡 /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 移除不必要的檔案。

如果有足夠的磁碟空間,日誌看起來會類似以下範例:

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.

若要移除不必要的檔案,請完成以下步驟:

  1. 使用 SSH 連線到主要節點

  2. 若要確認 NameNode 仍處於安全模式,請執行以下命令:

    [root@ip-###-##-##-### mnt]# hdfs dfsadmin -safemode getSafe mode is ON
  3. /mnt 刪除不必要的檔案。
    **注意:**如果在只有一個主要節點的叢集中,目錄 in/mnt/namenode/current 目錄使用了大量空間,請建立新的快照 (FsImage)。然後移除舊的編輯日誌。

  4. 檢查 /mnt 中的可用磁碟空間量。如果可用空間大於 100 MB,請執行以下命令再次檢查安全模式的狀態:

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

    範例輸出:

    Safe mode is ON
  5. 執行以下命令以關閉安全模式:

    [hadoop@ip-###-##-##-### ~]$ 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. 執行以下命令以檢查使用最多磁碟空間之資料夾內最大的子資料夾:

    cd /var
    sudo du -hsx * | sort -rh | head -10

    **注意:**前述命令會檢查 var 資料夾中最大的子資料夾。若要檢查其他資料夾,請將 var 替換為您要檢查的資料夾。

  5. 先刪除最大的檔案。請確認您只刪除不再需要的檔案。Amazon Simple Storage Service (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!
    前述範例輸出顯示 192.168.0.2 DataNode 儲存該區塊。您可以檢查 DataNode 的日誌,查看與特定區塊 ID (blk_##) 相關的錯誤。
    **注意:**遺失的區塊通常是因為節點意外終止造成的。
  3. 若要刪除已損毀的檔案,請退出安全模式,然後執行以下命令:
    hdfs dfs -rm example_file_name
    **注意:**請將 example_file_name 替換為您的檔案名稱。

使用 CloudWatch 指標監控 HDFS 的運作狀態

請使用以下 Amazon CloudWatch 指標來判斷 NameNode 為何會進入安全模式:

  • 若要確認 HDFS 儲存體的使用百分比,請檢閱 HDFSUtilization
  • 若要確認 HDFS 中沒有任何複本的區塊數量,請檢閱 MissingBlocks。這些可能是損毀的區塊。
  • 若要確認需要進行複寫的區塊數量,請檢閱 UnderReplicatedBlocks

相關資訊

Apache Hadoop 網站上的 HDFS 使用者指南

AWS 官方已更新 9 個月前