Comment résoudre le message d'erreur « no space left on device » (aucun espace restant sur l'appareil) dans Spark sur Amazon EMR ?

Dernière mise à jour : 08/01/2020

J'ai envoyé une application Apache Spark à un cluster Amazon EMR. L'application échoue avec le message d'erreur suivant « no space left on device » :

Job aborted due to stage failure: Task 31 in stage 8.0 failed 4 times, most recent failure: Lost task 31.3 in stage 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 : No space left on device

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 le message d'erreur « no space left on device ». Utilisez l'une des méthodes suivantes pour résoudre l'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 script d'action d'amorçage recommandé, consultez Dynamically scale up storage on Amazon EMR clusters.

Solution

Ajoutez plus de capacité EBS

Pour les nouveaux clusters : utilisez des volumes EBS plus volumineux

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 EBS par défaut pour les instances.

Pour exécuter des clusters : ajoutez des volumes EBS

1.    Si des volumes EBS plus grands 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

Ajoutez 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)

Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?