J'ai envoyé une application Apache Spark à un cluster Amazon EMR. L'application échoue avec l’échec d’étape suivant « aucun espace restant sur l’appareil » :
Tâche abandonnée en raison de l'échec d'étape : la tâche 31 de l'étape 8.0 a échoué 4 fois, échec le plus récent : tâche perdue 31.3 à l'étape 8.0 (TID 2036, ip-xxx-xxx-xx-xxx.compute.internal, executeur 139) : org.apache.spark.memory.sparkoutOfMemoryError : erreur lors de l'appel de spill() sur org.apache.spark.util.collection.unsafe.sort. UnsafeExternalSorter @1a698b89 : aucun espace restant sur l'appareil
Brève description
Spark utilise des disques locaux sur les nœuds principaux et de tâches pour stocker des données intermédiaires. Si les disques manquent d'espace, la tâche échoue avec l'erreur « aucun espace restant sur l’appareil ». Utilisez l'une des méthodes suivantes pour résoudre cette erreur :
- Ajoutez davantage de capacité Amazon Elastic Block Store (Amazon EBS).
- Ajoutez d'autres partitions Spark.
- Utilisez une action d'amorçage pour augmenter dynamiquement le stockage sur les nœuds principaux et de tâches. Pour obtenir plus d'informations et un exemple de script d'action d'amorçage, consultez Augmentation dynamique du stockage sur des clusters Amazon EMR.
Résolution
Ajoutez plus de capacité EBS
Pour les nouveaux clusters : utilisez des volumes EBS plus importants
Lancez un cluster Amazon EMR et choisissez un type d'instance Amazon Elastic Compute Cloud (Amazon EC2) avec des volumes EBS plus importants. Pour plus d'informations sur la quantité de stockage et le nombre de volumes alloués pour chaque type d'instance, consultez Stockage Amazon EBS par défaut pour les instances.
Pour exécuter des clusters : ajoutez des volumes EBS
1. Si des volumes EBS plus importants ne résolvent pas le problème, attachez plus de volumes EBS aux nœuds principaux et de tâches.
2. Formatez et montez les volumes attachés. Veillez à utiliser le numéro de disque correct (par exemple, /mnt1 ou /mnt2 au lieu de /data).
3. Connectez-vous au nœud à l’aide de SSH.
4. Créez un répertoire /mnt2/yarn puis définissez la propriété du répertoire sur l'utilisateur YARN :
sudo mkdir /mnt2/yarn
chown yarn:yarn /mnt2/yarn
5. Ajoutez le répertoire /mnt2/yarn dans la propriété yarn.nodemanager.local-dirs de /etc/hadoop/conf/yarn-site.xml. Exemple :
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/mnt/yarn,/mnt1/yarn,/mnt2/yarn</value>
</property>
6. Redémarrez le service NodeManager :
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager
Ajouter d'autres partitions Spark
En fonction du nombre de nœuds principaux et de tâches dans le cluster, envisagez d'augmenter le nombre de partitions Spark. Utilisez le code Scala suivant pour ajouter d'autres partitions Spark :
val numPartitions = 500
val newDF = df.repartition(numPartitions)
Informations connexes
Comment résoudre les échecs d'étape des tâches dans Spark sur Amazon EMR ?