如何關閉 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 分散式檔案系統 (HDFS) 叢集的唯獨模式。NameNode 可能會因為不同的原因而進入安全模式,例如下列事項:
- 可用空間小於 NameNode 儲存目錄所需的空間量。NameNode 目錄所需的空間量取決於 dfs.namenode.resource.du.reserved 參數。
- NameNode 無法將 FsImage 和 EditLog 載入記憶體。
- NameNode 沒有收到來自 DataNode 的區塊報告。
檢查 NameNode 日誌,以便找到日誌位置 /var/log/hadoop-hdfs/ 中所記錄問題的根本原因。
解決方案
請根據您的使用案例,嘗試下列一個或多個疑難排解選項。
切換至具有多個主節點的叢集
具有單一主節點的叢集不會自動建立檢查點。這意味著 HDFS 編輯日誌不會備份到新的快照 (FsImage) 和被刪除。HDFS 使用編輯日誌來記錄快照之間的文件系統變更。如果您的叢集具有單一主節點,而且您沒有手動移除編輯日誌,這些日誌最終會用掉 /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 刪除不必要的檔案。以具有一個主節點的叢集為例,如果 /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. 判斷哪個檔案/資料夾佔用磁碟空間之後,請選擇刪除這些檔案。請確定您只刪除不再需要的檔案。在 /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
相關資訊
HDFS 使用者指南的 Hadoop 文件