Come posso disattivare il servizio Safemode per il NameNode sul mio cluster Amazon EMR?

Ultimo aggiornamento: 23/12/2022

Il servizio NameNode entra in Safemode quando provo a eseguire un processo Apache Hadoop o Apache Spark su un cluster Amazon EMR. Ho provato a disattivare Safemode, ma si riattiva immediatamente. Voglio far uscire NameNode da Safemode.

Breve descrizione

Quando si prova a eseguire un processo Apache Hadoop o Apache Spark su un cluster Amazon EMR, potresti visualizzare uno dei seguenti messaggi di errore:

"Cannot create file/user/test.txt._COPYING_ (Impossibile creare file/user/tst.txt_COPYING_). Il nodo del nome è in modalità provvisoria."

"org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /user/hadoop/.sparkStaging/application_15xxxxxxxx_0001. ("org.apache.hadoop.hdfs.server.namenode.SafeModeException: Impossibile eliminare /user/hadoop/.sparkStaging/application_15xxxxxxxx_0001.) Il nodo del nome è in modalità provvisoria. È stato attivato manualmente. Utilizzare "hdfs dfsadmin -safemode leave" per disattivare la modalità provvisoria. NamenodeHostName:ip-xxx-xx-xx-xx.ec2.internal"

Safemode for NameNode è essenzialmente una modalità di sola lettura per il cluster del file system distribuito Hadoop (HDFS). In Safemode, non puoi apportare modifiche al file system o ai blocchi. Dopo che i DataNodes segnalano che la maggior parte dei blocchi del file system è disponibile, il NameNode esce automaticamente da Safemode. Tuttavia, il NameNode potrebbe entrare in Safemode per i seguenti motivi:

  • Lo spazio disponibile è inferiore alla quantità di spazio necessaria per la directory di archiviazione NameNode. La quantità di spazio necessaria per la directory NameNode è definita nel parametro dfs.namenode.resource.du.reserved.
  • NameNode non è in grado di caricare FsImage ed EditLog in memoria.
  • Il NameNode non ha ricevuto il rapporto di blocco da DataNode.
  • Alcuni nodi del cluster potrebbero essere inattivi. Ciò rende i blocchi sui nodi non disponibili.
  • Alcuni blocchi potrebbero essere danneggiati.

Verifica la causa principale del problema nella posizione del log NameNode /var/log/hadoop-hdfs/.

Risoluzione

Prima di uscire da Safemode, conferma di conoscere e capire perché il NameNode è bloccato in Safemode. Controlla lo stato di tutti i log DataNode e NameNode.

Importante: in alcuni casi, la disattivazione manuale di Safemode può causare la perdita di dati.

Per disattivare manualmente Safemode, esegui il seguente comando:

sudo -u hdfs hadoop dfsadmin -safemode leave

A seconda della causa principale dell'errore, completa una o più delle seguenti procedure di risoluzione dei problemi per disattivare Safemode.

Passaggio a un cluster con più nodi primari

Il checkpoint non è automatico nei cluster con un singolo nodo primario. Ciò significa che i log di modifica HDFS non vengono sottoposti a backup su un nuovo snapshot (FsImage) e poi rimossi. HDFS utilizza i log di modifica per registrare le modifiche al file system tra gli snapshot. È consigliabile rimuovere manualmente i log di modifica da un cluster con un singolo nodo primario. Se non rimuovi manualmente i log di modifica, i log potrebbero utilizzare tutto lo spazio su disco in /mnt. Per risolvere il problema, avvia un cluster con più nodi primari. I cluster con più nodi primari supportano l'elevata disponibilità per HDFS NameNode. L'elevata disponibilità del NameNode risolve il problema dei checkpoint.

Per ulteriori informazioni, consulta Pianificazione e configurazione di nodi primari.

Rimozione dei file non necessari da /mnt

Lo spazio su disco minimo disponibile per /mnt è specificato dal parametro dfs.namenode.resource.du.reserved. Quando la quantità di disco disponibile nella directory /mnt scende al di sotto del valore impostato in dfs.namenode.resource.du.reserved, NameNode entra in Safemode. Il valore di default per dfs.namenode.resource.du.reserved è 100 MB. Quando NameNode è in Safemode, non sono consentite modifiche al file system o al blocco. Pertanto, la rimozione dei file non necessari da /mnt potrebbe aiutare a risolvere il problema.

Per eliminare i file che non sono più necessari, procedi come segue:

1.    Connettiti al nodo primario tramite SSH.

2.    Per verificare che NameNode sia in Safemode a causa di spazio su disco insufficiente, verifica i log NameNode. Questi log si trovano in /var/log/hadoop-hdfs. Se lo spazio su disco è sufficiente, i log potrebbero essere simili ai seguenti:

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

Se lo spazio su disco è insufficiente, i log potrebbero essere simili ai seguenti:

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.    Verifica che NameNode sia ancora in Safemode eseguendo il seguente comando:

[root@ip-xxx-xx-xx-xxx mnt]# hdfs dfsadmin -safemode get
Safe mode is ON

4.    Elimina i file non necessari da /mnt.

Se la directory in/mnt/namenode/current utilizza una grande quantità di spazio su un cluster con un nodo primario, crea un nuovo snapshot (FsIimage). Quindi, rimuovi i vecchi log di modifica.

Ad esempio, si esegue uno script che esegue le seguenti azioni:
Genera un nuovo snapshot.
Effettua il backup di vecchi log di modifica su un bucket Amazon Simple Storage Service (Amazon S3).
Rimuovi i log di modifica.

Script di esempio:

#!/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

Nota: lo script precedente non rimuove i log delle modifiche in corso.

5.    Verifica la quantità di spazio disponibile su disco in /mnt. Se lo spazio disponibile è superiore a 100 MB, controlla nuovamente lo stato di Safemode. Quindi, disattiva Safemode:

[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

Se /mnt ha ancora meno di 100 MB di spazio disponibile, esegui una o più delle seguenti operazioni:

Rimozione di altri file

1.    Connettiti al nodo primario tramite SSH.

2.    Passa alla directory /mnt:

cd /mnt

3.    Determina quali cartelle utilizzano la maggior parte dello spazio su disco:

sudo du -hsx * | sort -rh | head -10

4.    Continua a indagare finché non trovi l'origine del problema di spazio su disco. Ad esempio, se la cartella var utilizza una grande quantità di spazio su disco, verifica le sottocartelle più grandi in var:

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

5.    Dopo aver determinato quale file/cartella occupa spazio su disco, elimina questi file. Assicurati di eliminare solo i file che non ti servono più. I file di log compressi in /mnt/var/log/hadoop-hdfs/ e /mnt/var/log/hadoop-yarn/ di cui è già stato eseguito il backup nel bucket di registrazione di Amazon S3. Questi file di log sono buoni candidati per l’eliminazione.

6.    Dopo aver eliminato i file non necessari, controlla di nuovo lo stato di Safemode, quindi disattiva Safemode: Quindi, disattiva Safemode:

[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

Verifica la presenza di blocchi/file danneggiati o mancanti

1.    Esegui il comando seguente per visualizzare un rapporto che ti aiuti a verificare lo stato del cluster. Il rapporto fornisce anche una percentuale di blocchi non replicati e un numero di repliche mancanti.

hdfs fsck /

2.    Per ogni file nell'elenco, esegui il comando seguente per individuare il DataNode per ogni blocco del file:

hdfs fsck example_file_name -locations -blocks -files

Nota: sostituisci example_file_name con il tuo nome di file.

I messaggi visualizzati sono simili ai messaggi seguenti:

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!

Dai messaggi precedenti, puoi trovare il DataNode in cui è archiviato il blocco. Ad esempio, "192.168.0.2." È quindi possibile visualizzare i log di quel DataNode per cercare gli errori correlati all'ID del blocco (blk_xxx). I nodi vengono spesso terminati, con conseguente mancanza di blocchi.

3.    Per eliminare i file danneggiati, esci da Safemode. Quindi esegui il seguente comando:

hdfs dfs -rm example_file_name

Nota: sostituisci example_file_name con il tuo nome di file.

Usa le metriche di CloudWatch per monitorare lo stato di HDFS

Le seguenti metriche di Amazon CloudWatch possono aiutare a monitorare le potenziali cause dell'ingresso di un NameNode in modalità Safemode:

  • Utilizzo HDFS: la percentuale di archiviazione HDFS utilizzata.
  • MissingBlocks: il numero di blocchi in cui HDFS non ha repliche. Questi potrebbero essere blocchi danneggiati.
  • UnderReplicatedBlocks: il numero di blocchi che devono essere replicati una o più volte.

Guida per l'utente HDFS (dal sito Web di Apache Hadoop)

Questo articolo è stato utile?


Hai bisogno della fattura o di supporto tecnico?