1. A method implemented by one or more processing units, the method comprising: analyzing a structure of a job to determine: dependencies among tasks of the job, the dependencies including one task using output from another task, and a critical path of the job; building a model of execution time of the job by a computing cluster, the model based on the dependencies among the tasks and a length of the critical path, the model relating aggregate time spent to complete the tasks of the job to resources allocated to the job; and at a plurality of times: assessing processing remaining on the job, updating the model based on the processing remaining, the updating including considering the dependencies, the critical path, and execution failures of individual tasks of the job, and adjusting the resources allocated to the job based on the updated model and a utility function.