Why does a job fail with "No space left on device", but df says otherwise?
When performing a shuffle my Spark job fails and says "no space left on device", but when I run df -h
it says I have free space left! Why does this happen, and how can I fix it?
Solution 1:
By default Spark
uses the /tmp
directory to store intermediate data. If you actually do have space left on some device -- you can alter this by creating the file SPARK_HOME/conf/spark-defaults.conf
and adding the line. Here SPARK_HOME
is wherever you root directory for the spark install is.
spark.local.dir SOME/DIR/WHERE/YOU/HAVE/SPACE
Solution 2:
You need to also monitor df -i
which shows how many inodes are in use.
on each machine, we create M * R temporary files for shuffle, where M = number of map tasks, R = number of reduce tasks.
https://spark-project.atlassian.net/browse/SPARK-751
If you do indeed see that disks are running out of inodes to fix the problem you can:
- Decrease partitions (see
coalesce
withshuffle = false
). - One can drop the number to O(R) by “consolidating files”. As different file-systems behave differently it’s recommended that you read up on
spark.shuffle.consolidateFiles
and see https://spark-project.atlassian.net/secure/attachment/10600/Consolidating%20Shuffle%20Files%20in%20Spark.pdf. - Sometimes you may simply find that you need your DevOps to increase the number of inodes the FS supports.
EDIT
Consolidating files has been removed from spark since version 1.6. https://issues.apache.org/jira/browse/SPARK-9808
Solution 3:
I encountered a similar problem. By default, spark uses "/tmp" to save intermediate files. When the job is running, you can tab df -h
to see the used space of fs mounted at "/" growing up. When the space of the dev is runned out of, this exception is thrown. To solve the problem, I set the SPARK_LOCAL_DIRS
in the SPARK_HOME/conf/spark_defaults.conf with a path in a fs leaving enough space.
Solution 4:
Another scenario for this error:
- I have a spark-job which uses two sources of data (~150GB and ~100GB) and performs an inner join, many group-by, filtering, and mapping operations.
- I created a 20 nodes(r3.2xlarge) spark-cluster using spark ec-2 scripts
Problem:
My job throwing error "No space left on device". As you can see my job requires so many shuffling, So to counter this problem I have used 20-nodes initially then increased to 40-nodes. Somehow the problem was still happening. I tried all other stuff like changing the spark.local.dir
, repartitioning, Custom partitions, and parameter tuning(compression, spiling, memory, memory fraction, etc.) as much I could do. Also, I used instance type r3.2xlarge which has 1 x 160 SSD but the problem still happening.
Solution:
I logged into one of the nodes, and executed df -h /
I found the node has only one mounted EBS volume(8GB) but there was no SSD(160GB). Then I looked into ls /dev/
and SSD was attached. This problem was not happening for all the nodes in the cluster. The error "No space left on device" happening for only those nodes which do not have SSD mounted. As they are dealing with only 8GB(EBS) and out of that ~4 GB space was available.
I created another bash script which launches the spark cluster using the spark-ec2 script then mount the disk after formatting it.
-
ec2-script
to launch cluster MASTER_HOST = <ec2-script> get-master $CLUSTER_NAME
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"