Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why declaring Mapper and Reducer classes as static?

This is likely showing my lack of Java understanding but I am wondering why in most MapReduce programs mapper and reducer classes are declared as static?

like image 489
kee Avatar asked Jul 19 '12 23:07

kee


2 Answers

When declaring mapper and reducer classes as inner classes to another class, they have to be declared static such that they are not dependent on the parent class.

Hadoop uses reflection to create an instance of the class for each map or reduce task that runs. The new instance created expects a zero argument constructor (otherwise how would it know what to pass).

By declaring the inner mapper or reduce class without the static keyword, the java compile actually creates a constructor which expects an instance of the parent class to be passed in at construction.

You should be able to see this by running the javap command against the generated classfile

Also, the static keyword is not valid when used in a parent class declaration (which is why you never see it at the top level, but only in the child classes)

like image 176
Chris White Avatar answered Oct 25 '22 08:10

Chris White


I can think of two reasons:

  1. When performing the map-reduce methods no state is needed which has to be preserved in the object. Thus all necessary information are passed to the method, no need to store additional data in the object. If the life time of the object will not exceed one method call, why should you struggle then with instantiation?
  2. It does not make sense to have more than one object of it, similar reasons for which you would implement the Singleton Pattern.
like image 1
Konrad Reiche Avatar answered Oct 25 '22 09:10

Konrad Reiche