I've had my share of troubles regarding this too. When a task encounters an error, all I see is:
Exception in thread "main" java.io.IOException: Job failed!
<snip useless info>
I attach a preview patch of my suggestion. It is against 0.4, but I'll forward port it to head and integrate it more with the rest of the system, if the approach is generally accepted by the devs. Please consider the patch as a idea-preview, not as a serious stab at the problem.
The approach is to add a public JobStatus.lastError string, which can be set from any throwable like JobStatus.setLastError(Throwable t). Setting this at relevant places (fx. on errors in mapred.LocalJobRunner.run() as in the patch) is useful for debugging purposes (for me atleast).