MAPREDUCE-1220's "UberTask", which essentially runs small jobs sequentially within a single Task (and therefore in a single JVM), the MRv2 version does so within an "UberAppMaster"--which is really just the regular MRAppMaster with two container services overridden (allocator, launcher). The analogue to UberTask's run() method is LocalContainerLauncher's SubtaskRunner.run(), which hooks into the state machines and executes the subtasks sequentially.
This design is much cleaner than that in MR-1220 since the subtasks are "real" and can communicate directly with external entities, and the uber-AM is the regular AM and requires no special UI handling (though we'll want to flag uberized AMs and jobs in the UI somehow). UberTask, on the other hand, had to translate its subtasks' status-updates and was very awkward to integrate with the UI (is it a ReduceTask or an UberTask? – the cascade of required changes was huge and never completed).
Kudos go to Sharad Agarwal for this design.