PipeRDD creates a process to run the command and spawns a thread to feed the input data to the process's stdin. If there is any exception in the child thread which gets the input data from the parent RDD, the child thread does not propagate that exception to the main thread. eg. In event of fetch failures, since the exception is not be propagated, the entire stage fails. The correct behaviour would be to recompute the parent(s) and then relaunch the stage.