2012-07-19 13 views

Respuesta

14

Al declarar las clases mapper y reducer como clases internas a otra clase, deben declararse estáticas de manera que no dependan de la clase principal.

Hadoop utiliza la reflexión para crear una instancia de la clase para cada mapa o reducir la tarea que se ejecuta. La nueva instancia creada espera un constructor de cero argumentos (de lo contrario, ¿cómo sabría qué pasar).

Al declarar el asignador interno o reducir la clase sin la palabra clave estática, la compilación java en realidad crea un constructor que espera que una instancia de la clase principal se pase en la construcción.

Usted debe ser capaz de ver esto ejecutando el comando javap contra la generaron archivo de clase

Además, la palabra clave estática no es válido cuando se utiliza en una declaración de la clase padre (que es por eso que nunca se ve en la parte superior nivel, pero solo en las clases secundarias)

+0

Gracias. En realidad, tu explicación sobre la reflexión resolvió algún otro problema que tuve. – kee

+0

@Chris White Eres genio. –

1

puedo pensar en dos razones:

  1. Al realizar los métodos de cartografía reducir ningún estado se necesita que tiene que ser conservado en el objeto. Por lo tanto, toda la información necesaria se pasa al método, no es necesario almacenar datos adicionales en el objeto. Si el tiempo de vida del objeto no excederá una llamada a un método, ¿por qué debería luchar entonces con creación de instancias?
  2. No tiene sentido tener más de un objeto, razones similares por las cuales implementaría el Singleton Pattern.
+0

Esto no es correcto: en map-reduce, se crean varias instancias concretas de la clase Mapper; y de hecho pueden mantener el estado. Supongo que el significado de "estático" es diferente en Java vs. DO#. –

Cuestiones relacionadas