如何關閉 Amazon EMR 叢集上 NameNode 服務的安全模式?
當我嘗試在 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 無法將 FsImage 和 EditLog 載入記憶體。
- 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 網站)
相關內容
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 24 天前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 個月前