如何關閉 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 無法將 FsImageEditLog 載入記憶體。
  • 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 文件

此文章是否有幫助?


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