UV (Unique Visitor) es un visitante independiente que cuenta el número de usuarios que visitan un sitio en un día (basado en cookies); un cliente de computadora que accede al sitio web es un visitante. Se puede entender como la cantidad de computadoras que acceden a un sitio web. El sitio web juzga la identidad de la computadora visitante a través de las cookies de la computadora visitante. Si cambia la IP pero no borra las cookies y luego visita el mismo sitio web, el número de UV en las estadísticas del sitio web no cambia. Si el usuario no guarda el acceso a las cookies, borra las cookies o cambia el acceso al dispositivo, el recuento aumentará en 1. El mismo cliente múltiples visitas entre 00: 00-24: 00 solo contará como 1 visitante.
Un archivo de clase webLogUVMapper de escritura
paquete com.huadian.webloguvs; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; WebLogUVMapper de clase pública extiende Mapper <LongWritable, Text, Text, Text> { texto privado outputKey = new Text (); texto privado outputValue = new Text (); @Anular el mapa vacío protegido (clave LongWritable, valor de texto, contexto de contexto) genera IOException, InterruptedException { // Divide cada línea de contenido, Línea de cadena = value.toString (); Cadena [] elementos = line.split ("\ t"); / ** * (1) Uno tiene 36 campos. Si la longitud de la matriz es inferior a 36 después de la división, estos datos son datos sucios y se pueden descartar * (2) Si la URL está vacía, el registro descarta el subíndice 1, "", nulo, "nulo" * Ciudad subíndice 23 * Salida (Id. De ciudad, 1) * / if (items.length> = 36) { if (StringUtils.isBlank (elementos [5])) { regreso; } outputKey.set (elementos [24]); outputValue.set (ítems [5]); context.write (outputKey, outputValue); } más { regreso; } } } |
Dos archivos de clase de escritura WebLogUVMapReduce
paquete com.huadian.webloguvs; importar org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; WebLogUVMapReduce de clase pública extiende la herramienta de implementos configurados { @Anular public int run (String [] args) lanza Exception { // 2, crea un trabajo Trabajo trabajo = Job.getInstance (this.getConf (), "WebLogUVMapReduce"); // Establecer la clase principal de operación de trabajo job.setJarByClass (WebLogUVMapReduce.class); // Establecer trabajo // una entrada 、 Ruta inputPath = nueva Ruta (args [0]); FileInputFormat.setInputPaths (trabajo, inputPath); // b 、 mapa job.setMapperClass (WebLogUVMapper.class); job.setMapOutputKeyClass (Text.class); job.setMapOutputValueClass (Text.class); job.setNumReduceTasks (2); // c 、 reducir job.setReducerClass (WebLogUVReducer.class); job.setOutputKeyClass (Text.class); job.setOutputValueClass (Text.class); // d 、 salida Ruta outputPath = nueva ruta (args [1]); // Si el directorio de salida existe, elimínelo primero FileSystem hdfs = FileSystem.get (this.getConf ()); if (hdfs.exists (outputPath)) { hdfs.delete (outputPath, true); } FileOutputFormat.setOutputPath (job, outputPath); // El cuarto paso, envía el trabajo boolean isSuccess = job.waitForCompletion (true); return isSuccess? 0: 1; } public static void main (String [] args) { Configuración de la configuración = nueva Configuración (); /// public static int run (configuración conf, herramienta herramienta, cadena [] args) tratar { int status = ToolRunner.run (configuración, nuevo WebLogUVMapReduce (), args); System.exit (estado); } catch (Excepción e) { e.printStackTrace (); } } } |
Tres archivos de clase de escritura WebLogUVReducer
paquete com.huadian.webloguvs; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; import java.util.HashSet; import java.util.Iterator; importe java.util.Set; WebLogUVReducer de clase pública extiende Reducer <Texto, Texto, Texto, Texto> { texto privado outputValue = new Text (); @Anular reducción nula protegida (clave de texto, valores <texto> Iterable, contexto de contexto) produce InterruptedException, IOException { // clave : 城市 ; valor : <guid1, guid1, guid2, guid3> Establecer <Texto> conjunto = nuevo HashSet <Texto> (); para (Valor de texto: valores) { set.add(value); } /*Iterator<Text> iterator = set.iterator(); Text text = null; while (iterator.hasNext()){ text = iterator.next(); }*/ outputValue.set(String.valueOf(set.size())); context.write( key,outputValue ); } } |