如何關閉 Amazon EMR 叢集上 NameNode 服務的安全模式?

上次更新日期:2022 年 12 月 23 日

當我嘗試在 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: Cannot delete /user/hadoop/.sparkStaging/application_15xxxxxxxx_0001. Name node is in safe mode. It was turned on manually. Use "hdfs dfsadmin -safemode leave" to turn safe mode off. NamenodeHostName:ip-xxx-xx-xx-xx.ec2.internal (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 分散式檔案系統 (HDFS) 叢集的唯獨模式。在安全模式中,您無法對檔案系統或區塊進行任何修改。在 DataNodes 報告大部分檔案系統區塊都可用之後,NameNode 會自動離開安全模式。但是,NameNode 可能會進入安全模式的原因如下:

  • 可用空間小於 NameNode 儲存目錄所需的空間量。NameNode 目錄所需的空間量取決於 dfs.namenode.resource.du.reserved 參數。
  • NameNode 無法將 FsImageEditLog 載入記憶體。
  • NameNode 沒有收到來自 DataNode 的區塊報告。
  • 叢集中的某些節點可能已關閉。這使得節點上的區塊無法使用。
  • 某些區塊可能已損毀。

在 NameNode 日誌位置 /var/log/hadoop-hdfs/ 中檢查問題的根本原因。

解決方案

離開安全模式之前,請確認您知道並理解為什麼 NameNode 卡在安全模式中。檢閱所有 DataNodes 和 NameNode 日誌的狀態。

重要:在某些情況下,手動關閉安全模式可能會導致資料遺失。

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

sudo -u hdfs hadoop dfsadmin -safemode leave

根據錯誤的根本原因,完成下列一或多個疑難排解步驟以關閉安全模式。

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

具有單一主節點的叢集不會自動建立檢查點。這意味著 HDFS 編輯日誌不會備份到新的快照 (FsImage) 並且會移除。HDFS 使用編輯日誌來記錄快照之間的文件系統變更。最佳實務是從具有單一主節點的叢集中手動移除編輯日誌。如果您未手動移除編輯日誌,則日誌可能會使用 /mnt 中的所有磁碟空間。若要解決這個問題,請啟動具有多個主節點的叢集。具有多個主節點的叢集支援 HDFS NameNode 的高可用性。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 刪除不必要的檔案。

如果目錄 in/mnt/namenode/current 在具有一個主節點的叢集上使用大量空間,則建立新的快照 (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:必須複製一或多次的區塊數目。

HDFS 使用者指南 (來自 Apache Hadoop 網站)

此文章是否有幫助?


您是否需要帳單或技術支援?