Estoy usando Hadoop para analizar una distribución de datos muy desigual. Algunas teclas tienen miles de valores, pero la mayoría tiene solo una. Por ejemplo, el tráfico de red asociado con las direcciones IP tendría muchos paquetes asociados con algunas IP hablativas y solo algunos con la mayoría de las IP. Otra forma de decir esto es que el Gini index es muy alto.En Hadoop Map-Reduce, ¿alguna clase ve la lista completa de claves después de ordenar y antes de particionar?
Para procesar esto de manera eficiente, cada reductor debe obtener unas pocas teclas de alto volumen o un montón de teclas de bajo volumen, de forma tal que se obtenga una carga más o menos pareja. Sé cómo haría esto si estuviera escribiendo el proceso de partición: Tomaría la lista ordenada de keys
(incluidas todas las claves duplicadas) producida por los correlacionadores, así como el número de reductores N
y poner divisiones en
split[i] = keys[floor(i*len(keys)/N)]
Reductor i
obtendría teclas k
tal que split[i] <= k < split[i+1]
para 0 <= i < N-1
y split[i] <= k
para i == N-1
.
Estoy dispuesto a escribir mi propio particionador en Java, pero la clase Partitioner<KEY,VALUE> solo parece tener acceso a un registro de clave-valor a la vez, no a toda la lista. Sé que Hadoop clasifica los registros que produjeron los mapeadores, por lo que esta lista debe existir en alguna parte. Podría distribuirse entre varios nodos del particionador, en cuyo caso yo haría el procedimiento de división en una de las sublistas y de alguna manera comunicaría el resultado a todos los demás nodos del particionador. (Suponiendo que el nodo del particionador elegido ve un subconjunto aleatorizado, el resultado aún sería aproximadamente equilibrado de la carga). ¿Alguien sabe dónde se almacena la lista ordenada de claves y cómo acceder a ella?
No quiero escribir dos trabajos de reducción de mapa, uno para encontrar las divisiones y otro para usarlas realmente, porque eso parece un desperdicio. (Los cartógrafos tendrían que hacer el mismo trabajo dos veces.) Esto parece un problema general: las distribuciones desiguales son bastante comunes.