Ho inviato un'applicazione Apache Spark a un cluster Amazon EMR. L'applicazione ha esito negativo con un errore di fase “Spazio esaurito sul dispositivo” simile al seguente: Processo interrotto a causa di un errore di fase: L'attività 31 nella fase 8.0 ha avuto esito negativo 4 volte, errore più recente: Attività 31.3 persa nella fase 8.0 TID 2036, ip-xxx-xxx-xx-xxx.compute.internal, executor 139): org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter@1a698b89 : Spazio esaurito sul dispositivo
Breve descrizione
Spark utilizza dischi locali sui nodi core e task per archiviare dati intermedi. Se lo spazio sui dischi esaurisce, il processo ha esito negativo e viene visualizzato l'errore “Spazio sul dispositivo esaurito”. Utilizza uno dei seguenti metodi per risolvere questo errore:
Soluzione
Aggiungi ulteriore capacità EBS
Per i nuovi cluster: usa volumi EBS più grandi
Avvia un cluster Amazon EMR e scegli un tipo di istanza Amazon Elastic Compute Cloud (Amazon EC2) con volumi EBS più grandi. Per ulteriori informazioni sulla quantità di spazio di archiviazione sul numero di volumi allocati per ogni tipo di istanza, consulta Spazio di archiviazione Amazon EBS predefinito per le istanze.
**Per i cluster in esecuzione: aggiungi altri volumi EBS **
1. Se volumi EBS più grandi non risolvono il problema, collega più volumi EBS ai nodi core e attività.
2. Formattare e montare i volumi allegati. Assicurarsi di utilizzare il numero di disco corretto (ad esempio, /mnt1 o /mnt2 anziché /data).
3. Connettiti al nodo tramite SSH.
4. Crea una directory ** /mnt2/yarn**, quindi imposta la proprietà della directory per l'utente YARN:
sudo mkdir /mnt2/yarn
chown yarn:yarn /mnt2/yarn
5. Aggiungi la directory /mnt2/yarn all'interno della proprietà yarn.nodemanager.local-dirs di /etc/hadoop/conf/yarn-site.xml. Esempio:
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/mnt/yarn,/mnt1/yarn,/mnt2/yarn</value>
</property>
6. Riavvia il servizio NodeManager:
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager
Aggiungi altre partizioni Spark
A seconda del numero di nodi core e attività presenti nel cluster, valuta la possibilità di aumentare il numero di partizioni Spark. Usa il seguente codice Scala per aggiungere altre partizioni Spark:
val numPartitions = 500
val newDF = df.repartition(numPartitions)
Informazioni correlate
Come posso risolvere gli errori di fase nei processi Spark su Amazon EMR?