While it is possible to perform every step of the map-reduce model yourself, one of the other benefits of the model is that certain steps can easily be automated. This is where a map-reduce framework comes in. As explained above, the splitting, sorting, and storage steps are usually handled by this framework. Other jobs that a framework typically performs include:
Spawning mappers and reducers. These could be in separate threads, separate processes, or even separate machines. The framework, perhaps guided by a job's configuration, can decide how many processes are necessary.
Distributing data to the mappers and reducers. This especially important when running on many different machines.
Recovering from errors. If a map or reduce task fails, the framework can start another identical task (perhaps on a different machine this time) to make up the lost work. This fault-tolerance is an important feature of map-reduce.