Hadoop tiene un Partitioner por defecto, el HashPartitioner, que a través de su método hashCode() determina a qué partición pertenece una determinada Key y por tanto a qué Reducer va a ser enviado el registro. El número de particiones es igual al número de tareas reduce del job.
A veces, por ciertas razones necesitamos implementar nuestro propio Partitioner para controlar que una serie de Keys vayan al mismo Reducer, es por esta razón que crearíamos nuestra propia clase MyPartitioner que heredaría de la interfaz Partitioner y que implementará el método getPartition.
public class MyPartitioner<K2, V2> extends Partitioner<KEY, VALUE> implements Configurable { public int getPartition(KEY key, VALUE value, int numPartitions){} }
getPartition recibe una key, un valor y el número de particiones en el que se deben dividir los datos cuyo rango está entre 0 y "numPartitions -1" y devolverá un número entre 0 y numPartitions indicando a qué partición pertenecen esos datos recibidos.
Para configurar un partitioner, basta con añadir en el Driver la línea:
job.setPartitionerClass(MyPartitioner.class);
También nos tenemos que acordar de configurar el número de Reducer al número de particiones que vamos a realizar:
job.setNumReduceTasks(numPartitions);
En la entrada siguiente mostraré un ejemplo concreto del Partitioner.
No hay comentarios:
Publicar un comentario
Gracias por dejar vuestras sugerencias, dudas, críticas o comentarios en general