2012-04-16 37 views
5

Me pregunto si es posible agregar un objeto miembro que se pueda usar en varias llamadas a map(). Por ejemplo, un StringBuilder:¿El objeto Mapper de Hadoop está compartido en varios subprocesos?

private StringBuilder builder; 

public void map(...){ 
    ... 

    builder.setLength(0); 
    builder.append(a); 
    builder.append(b); 
    builder.append(c); 
    d = builder.toString(); 

    ... 
} 

Obviamente, si el objeto del asignador se comparte a través de múltiples hilos, el objeto constructor anterior no se comportan como se esperaba debido al acceso simultáneo de más de un hilos.

Así que mi pregunta es: ¿está seguro de que cada hilo en hadoop usará un objeto mapeador dedicado por sí mismo? ¿O es un comportamiento configurable?

Gracias

Respuesta

2

Siempre y cuando no esté utilizando la clase MultithreadedMapper, pero la suya, no habrá ningún problema. map() se llama secuencial y no en paralelo.

Es común usar un StringBuilder u otras estructuras de datos para almacenar algunos objetos entre las llamadas. Pero asegúrese de clonar los objetos de sus objetos de entrada, solo hay un objeto y se rellenará una y otra vez para evitar muchos GC.

Por lo tanto, no es necesario sincronizar ni tener en cuenta las condiciones de carrera.

+0

Eso es lo que quiero saber. Gracias. – JRaSH

+1

Solo necesita clonar los objetos si necesita todo el objeto clave/valor; de lo contrario, si solo necesita algunos de los contenidos que agrega a StringBuffer, todo irá bien. No se olvide de agregar el método de limpieza (se me olvida el nombre para anular) para enjuagar/escribir en el Reducer lo que esté almacenando en el buffer entre las llamadas de Mapa, de lo contrario terminará con algunos datos que nunca se enviarán a los Reductores. – Drizzt321

0

No creo que eso sea posible. La razón de esto es que cada asignador se ejecuta en su propia JVM (se distribuirán en diferentes máquinas), por lo que no hay manera de que pueda compartir una variable u objeto entre múltiples mapeadores o reductores fácilmente.

Ahora bien, si todos los creadores de mapas se ejecutan en el mismo nodo, creo que hay una configuración para JVM reutilizar en alguna parte, pero sinceramente no me molestaría con eso, especialmente si todo lo que necesita es un StringBuilder :)

He visto esta pregunta una vez, y podría resolverse muy fácilmente cambiando el diseño de la aplicación. Tal vez pueda contar más sobre lo que está tratando de lograr con esto para ver si realmente se necesita. Si realmente lo necesita, puede serializar su objeto, ponerlo en HDFS, luego leerlo con cada mapeador, deserializarlo, pero eso parece al revés.

+0

Hola, no me refiero a compartir una variable en varios mapeadores. Hasta donde yo sé, el método map (map) de cada mapeador se llama múltiples veces, ahí es donde creo que puedo ahorrar algunos recursos. Entonces, al poner un objeto miembro en la instancia del mapeador, este objet se puede volver a enviar a través de múltiples llamadas a map() sin init y de-init una y otra vez. Mi preocupación es: si map() se llama concurrentemente, podría causar un problema al usar el objeto memeber. – JRaSH

Cuestiones relacionadas