¿Cuál es la mejor manera de contar visitantes únicos con Hadoop?

hey all, recién comenzando hadoop y curioso, cuál sería la mejor manera en mapreduce para contar visitantes únicos si sus archivos de registro fueran así …

DATE siteID action username 05-05-2010 siteA pageview jim 05-05-2010 siteB pageview tom 05-05-2010 siteA pageview jim 05-05-2010 siteB pageview bob 05-05-2010 siteA pageview mike 

¿Y para cada sitio que quería averiguar los visitantes únicos para cada sitio?

Estaba pensando que el mapeador emitiría un nombre de usuario de ID de sitio y que el reductor mantendría un conjunto () de los nombres de usuario únicos por clave y luego emitiría la longitud de ese conjunto. Sin embargo, eso sería potencialmente almacenar millones de nombres de usuarios en la memoria, lo que no parece correcto. ¿Alguien tiene una mejor manera?

Estoy usando streaming de python por cierto

Gracias

Podrías hacerlo como una operación de 2 etapas:

El primer paso es emitir (username => siteID) , y hacer que el reductor simplemente colapse las apariciones múltiples de siteID usando un set , ya que normalmente tiene muchos menos sitios que usuarios, esto debería estar bien.

Luego, en el segundo paso, puede emitir (siteID => username) y hacer un conteo simple, ya que los duplicados se han eliminado.

Mi enfoque es similar al que dio Tzaman con un pequeño giro.

  1. salida del mapa: (nombre de usuario, siteid) => (“”)
  2. reducir salida: (siteid) => (1)
  3. mapa: identificador de identidad
  4. reducir: longsumreducer (es decir, simplemente resumir)

Tenga en cuenta que la primera reducción no tiene que revisar ninguno de los registros que se presentan. Simplemente puede examinar la clave y producir la salida.

HTH

Utilice la ordenación secundaria para ordenar en el ID de usuario. De esa manera, no necesita tener nada en la memoria, solo transmita los datos e incremente su contador distinto cada vez que vea el cambio de valor para un ID de sitio en particular.

Aquí hay algo de documentación .

A menudo es más rápido usar HiveQL para ordenar muchas tareas simples. Hive traducirá sus consultas a Hadoop MapReduce. En este caso puedes usar

 SELECT COUNT(DISTINCT username) FROM logviews 

Puede encontrar un ejemplo más avanzado aquí: http://www.dataminelab.com/blog/calculating-unique-visitors-in-hadoop-and-hive/