Take the 2-minute tour ×

In Hadoop when do reduce tasks start? Do they start after a certain percentage (threshold) of mappers complete? If so, is this threshold fixed? What kind of threshold is typically used?

share|improve this question

8 Answers 8

up vote 68 down vote accepted

The reduce phase has 3 steps: shuffle, sort, reduce. Shuffle is where the data is collected by the reducer from each mapper. This can happen while mappers are generating data since it is only a data transfer. On the other hand, sort and reduce can only start once all the mappers are done. You can tell which one MapReduce is doing by looking at the reducer completion percentage: 0-33% means its doing shuffle, 34-66% is sort, 67%-100% is reduce. This is why your reducers will sometimes seem "stuck" at 33%-- it's waiting for mappers to finish.

Reducers start shuffling based on a threshold of percentage of mappers that have finished. You can change the parameter to get reducers to start sooner or later.

Why is starting the reducers early a good thing? Because it spreads out the data transfer from the mappers to the reducers over time, which is a good thing if your network is the bottleneck.

Why is starting the reducers early a bad thing? Because they "hog up" reduce slots while only copying data and waiting for mappers to finish. Another job that starts later that will actually use the reduce slots now can't use them.

You can customize when the reducers startup by changing the default value of mapred.reduce.slowstart.completed.maps in mapred-site.xml. A value of 1.00 will wait for all the mappers to finish before starting the reducers. A value of 0.0 will start the reducers right away. A value of 0.5 will start the reducers when half of the mappers are complete. You can also change mapred.reduce.slowstart.completed.maps on a job-by-job basis. In new versions of Hadoop (at least 2.4.1) the parameter is called is mapreduce.job.reduce.slowstart.completedmaps (thanks user yegor256).

Typically, I like to keep mapred.reduce.slowstart.completed.maps above 0.9 if the system ever has multiple jobs running at once. This way the job doesn't hog up reducers when they aren't doing anything but copying data. If you only ever have one job running at a time, doing 0.1 would probably be appropriate.

share|improve this answer
do you know where can I read more about what you have mentioned? –  daydreamer Jul 26 '12 at 22:54
Slowstart is quite poorly documented in my opinion.... as are most of the obscure configuration parameters. –  Donald Miner Jul 27 '12 at 14:45
Good answer @Donald Miner. Just want to add that in newer Hadoop version (I'm using 1.1.2), the value is defaulted to 0.05. hadoop.apache.org/docs/r1.1.2/mapred-default.html –  sufinawaz Sep 26 '13 at 19:46
@Donald I am using the version of hadoop and set the parameter "mapred.reduce.slowstart.completed.maps" in mapred-site.xml to 0.1, but the reducer still runs after the mappers complete. May I know why ? –  harry potter Jul 8 at 9:23
@harrypotter only thing I can think of is if you restarted your jobtracker and maybe tasktrackers after making the change. Also, are you sure the config file propagated throughout your entire cluster? –  Donald Miner Jul 8 at 17:46

The reduce phase can start long before a reducer is called. As soon as "a" mapper finishes the job, the generated data undergoes some sorting and shuffling (which includes call to combiner and partitioner). The reducer "phase" kicks in the moment post mapper data processing is started. As these processing is done, you will see progress in reducers percentage. However, none of the reducers have been called in yet. Depending on number of processors available/used, nature of data and number of expected reducers, you may want to change the parameter as described by @Donald-miner above.

share|improve this answer

As much I understand Reduce phase start with the map phase and keep consuming the record from maps. However since there is sort and shuffle phase after the map phase all the outputs have to be sorted and sent to the reducer. So logically you can imagine that reduce phase starts only after map phase but actually for performance reason reducers are also initialized with the mappers.

share|improve this answer

The percentage shown for the reduce phase is actually about the amount of the data copied from the maps output to the reducers input directories. To know when does this copying start? It is a configuration you can set as Donald showed above. Once all the data is copied to reducers (ie. 100% reduce) that's when the reducers start working and hence might freeze in "100% reduce" if your reducers code is I/O or CPU intensive.

share|improve this answer

Consider a WordCount example in order to understand better how the map reduce task works.Suppose we have a large file, say a novel and our task is to find the number of times each word occurs in the file. Since the file is large, it might be divided into different blocks and replicated in different worker nodes. The word count job is composed of map and reduce tasks. The map task takes as input each block and produces an intermediate key-value pair. In this example, since we are counting the number of occurences of words, the mapper while processing a block would result in intermediate results of the form (word1,count1), (word2,count2) etc. The intermediate results of all the mappers is passed through a shuffle phase which will reorder the intermediate result.

Assume that our map output from different mappers is of the following form:

Map 1:- (is,24) (was,32) (and,12)

Map2 :- (my,12) (is,23) (was,30)

The map outputs are sorted in such a manner that the same key values are given to the same reducer. Here it would mean that the keys corresponding to is,was etc go the same reducer.It is the reducer which produces the final output,which in this case would be:- (and,12)(is,47)(my,12)(was,62)

share|improve this answer

Reduce tasks start only after all the mappers are completed. The input to reducer is dependent on the outputs produced from the mappers. So all the reducer have to wait till the input is received in the shuffled form.(Sorted) Shuffling is the intermmediate process between mappers and reducer which sorts all the values based on the keys they get.

share|improve this answer

Reduce starts only after all the mapper have fished there task, Reducer have to communicate with all the mappers so it has to wait till the last mapper finished its task.however mapper starts transferring data to the moment it has completed its task.

share|improve this answer

Reducer tasks starts only after the completion of all the mappers.

But the data transfer happens after each Map. Actually it is a pull operation.

That means, each time reducer will be asking every maptask if they have some data to retrive from Map.If they find any mapper completed their task , Reducer pull the intermediate data.

The intermediate data from Mapper is stored in disk. And the data transfer from Mapper to Reduce happens through Network (Data Locality is not preserved in Reduce phase)

share|improve this answer

Your Answer


