web-dev-qa-db-fra.com

Pourquoi un travail échoue-t-il avec "Il ne reste plus d'espace sur le périphérique", alors que df dit le contraire?

Lors d'une lecture aléatoire, ma tâche Spark échoue et indique "il ne reste plus d'espace sur le périphérique", mais lorsque j'exécute df -h, il indique qu'il me reste de la place! Pourquoi cela se produit-il et comment puis-je résoudre le problème?

36
samthebest

Vous devez également surveiller df -i, qui indique le nombre d'inodes utilisés.

sur chaque machine, nous créons des fichiers temporaires M * R pour la lecture aléatoire, où M = nombre de tâches de carte, R = nombre de tâches de réduction.

https://spark-project.atlassian.net/browse/SPARK-751

Si vous constatez effectivement que les disques sont à court d’inodes pour résoudre le problème, vous pouvez:

MODIFIER

La consolidation des fichiers a été supprimée de spark depuis la version 1.6 . https://issues.Apache.org/jira/browse/SPARK-9808

10
samthebest

Par défaut, Spark utilise le répertoire /tmp pour stocker les données intermédiaires. Si vous avez réellement de la place sur sur un périphérique -, vous pouvez le modifier en créant le fichier SPARK_HOME/conf/spark-defaults.conf et en ajoutant la ligne. Ici, SPARK_HOME se trouve où que se trouve votre répertoire racine pour l’installation par étincelle. 

spark.local.dir                     SOME/DIR/WHERE/YOU/HAVE/SPACE
24
quine

J'ai rencontré un problème similaire. Par défaut, spark utilise "/ tmp" pour enregistrer les fichiers intermédiaires. Lorsque le travail est en cours d'exécution, vous pouvez utiliser l'onglet df -h pour voir la taille de l'espace utilisé de fs monté dans "/". Lorsque l'espace du dev est épuisé, cette exception est levée. Pour résoudre le problème, j'ai défini le SPARK_LOCAL_DIRS dans le fichier SPARK_HOME/conf/spark_defaults.conf avec un chemin dans un fs laissant assez d'espace. 

7
uqb

Un autre scénario pour cette erreur: 

  1. J'ai un spark-job qui utilise deux sources de données (~ 150 Go et ~ 100 Go) et effectue une jointure interne, de nombreuses opérations de filtrage, de regroupement et de mappage.
  2. J'ai créé un spark-cluster de 20 nœuds (r3.2xlarge) à l'aide de scripts spark ec-2

Problème

Erreur de lancement de travail "Il ne reste plus d’espace sur le périphérique" . Comme vous pouvez le constater, mon travail nécessite de nombreux remaniements. Pour contrer ce problème, j’avais utilisé 20 nœuds au départ, puis une augmentation à 40 nœuds. D'une manière ou d'une autre, le problème se posait toujours. J'ai essayé tout ce que je pouvais faire, comme changer le spark.local.dir, la repartitionnement, les partitions personnalisées et le réglage des paramètres (compression, spiling, mémoire, fraction de mémoire, etc.). De plus, j'ai utilisé le type d'instance r3.2xlarge qui contient 1 x 160 SSD, mais le problème persiste.

Solution :

Je me suis connecté à l'un des nœuds et j'ai exécuté df -h /. Le nœud n'a qu'un seul volume EBS monté (8 Go), mais il n'y avait pas de disque SSD (160 Go). Ensuite, j'ai regardé dans ls /dev/ et SSD était attaché. Ce problème ne se produisait pas pour tous les nœuds du cluster. L'erreur "Il ne reste plus d'espace sur le périphérique" ne se produit que pour les nœuds sur lesquels aucun disque SSD n'est monté. Comme ils ne traitent que de 8 Go (EBS), environ 4 Go d’espace étaient disponibles.

J'ai créé un autre script bash qui lance le cluster spark à l'aide du script spark-ec2, puis monte le disque après l'avoir formaté.

  1. ec2-script pour lancer le cluster
  2. MASTER_Host = <ec2-script> get-master $CLUSTER_NAME
  3. ssh -o StrictHostKeyChecking=no root@$MASTER_Host "cd /root/spark/sbin/ && ./slaves.sh mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdb && ./slaves.sh mount -o defaults,noatime,nodiratime /dev/sdb /mnt"
5
swapnil

Sur la machine de travail, définissez la variable d'environnement "SPARK_LOCAL_DIRS" à l'emplacement où vous avez de l'espace disponible. La définition de la variable de configuration "spark.local.dir" ne fonctionne pas à partir de Spark 1.0 ou version ultérieure.

3
Thach Van

Quelques autres solutions de contournement: 

  • Suppression explicite des fichiers de lecture intermittente. Si vous ne voulez pas conserver le rdd pour un calcul ultérieur, vous pouvez appeler .unpersist () Qui marquera les fichiers de mélange aléatoire à supprimer (vous pouvez également redéfinir la variable rdd à Aucun).

  • Utiliser plus de travailleurs, l’ajout de plus de travailleurs réduira en moyenne le nombre de De fichiers suffisants intermédiaires/travailleurs nécessaires.

Plus d'informations sur l'erreur "Il ne reste plus d'espace sur le périphérique" sur ce fil de stockage de données: https://forums.databricks.com/questions/277/how-do-i-avoid-the-no-space-left -on-device-error.html

2
Amir Krifa

Veuillez changer le répertoire SPARK_HOME , car nous devons donner le répertoire qui a plus d’espace disponible pour exécuter notre travail en douceur.

0
Mangesh