WordCount代码实现

来源:互联网 发布:html个人简历模板源码 编辑:程序博客网 时间:2024/06/06 07:41

实验目的

1、了解Mapreduce模型

2、了解Hadoop JAVA API的基本用法

3、了解数据分析的基本流程

实验环境

1、Linux Ubuntu 14.04

2、hadoop-2.6.0-cdh5.4.5

3、hadoop-2.6.0-eclipse-cdh5.4.5.jar

4、eclipse-java-juno-SR2-linux-gtk-x86_64

实验内容

1、现有一个搜索引擎,每天支撑大量的搜索服务。

2、用户使用搜索引擎,搜索数据时,搜索引擎会产生一条日志,记录用户的搜索信息。

3、现有搜索日志文件,放在/data/mydata/目录下,名为solog,格式如下:(时间、ip、屏幕宽度、屏幕高度、当前搜索词、上一次搜索词)

view plain copy
  1. 20161220155843  192.168.1.179   1366    768     Sqoop       HTML  
  2. 20161220155911  192.168.1.179   1366    768     SparkR      Sqoop  
  3. 20161220155914  192.168.1.155   1600    900     hadoop  
  4. 20161220155921  192.168.1.155   1600    900     hahahhaha   hadoop  
  5. 20161220155928  192.168.1.155   1600    900     sqoop       hahahhaha  

4、编写MapReduce程序,统计每个搜索词分别被搜索了多少次。(WordCount)

5、结果数据样式

view plain copy
  1. AI  2  
  2. AR  2  
  3. AWK 2  
  4. Apache  2  
  5. CSS 4  
  6. Cassandra   2  
  7. DataMining  7  
  8. Docker  2  
  9. ETL 4  
  10. Echarts 6  
  11. Flume   6  
  12. HDFS    6  

实验步骤

1、打开eclipse,新建项目

选择Map/Reduce Project

在弹出的窗口中,输入项目的名称为mapreducedemo,以及项目的存储目录为/data/myjava目录下

另外在此处还需要指定Hadoop的路径,点击“Configure Hadoop Install directory”,弹出窗口,选择hadoop程序的安装位置。操作完毕后点击Next

再点击Finish则创建项目完毕

2.下面右键mapreducedemo下src目录,新建package

弹出的窗体中,输入包名my.mr

在my.mr下新建一个执行wordcount的类,名为MyWordCount

3.搜索日志solog文件已放在/data/mydata/目录 下,请将/data/mydata/solog文件,上传到HDFS上/mydata/目录下。

如果hdfs上/mydata目录不存在的话,需要提前创建

view plain copy
  1. hadoop fs -mkdir /mydata  

上传文件

view plain copy
  1. hadoop fs -put /data/mydata/solog  /mydata/solog  

4、下面编写MapReduce代码,MapReduce代码基本结构,都比较类似,结构如下。

view plain copy
  1. package my.mr;  
  2. import java.io.IOException;  
  3. import org.apache.hadoop.io.IntWritable;  
  4. import org.apache.hadoop.io.Text;  
  5. import org.apache.hadoop.mapreduce.Mapper;  
  6. import org.apache.hadoop.mapreduce.Reducer;  
  7. public class MyWordCount {  
  8.     public static void main(String[] args) {  
  9.     }  
  10.     public static class doMapper extends Mapper<Object, Text, Text, IntWritable>{  
  11.       @Override  
  12.         protected void map(Object key, Text value, Context context)  
  13.                         throws IOException, InterruptedException {  
  14.         }  
  15.     }  
  16.     public static class doReducer extends Reducer<Text,IntWritable, Text, IntWritable>{  
  17.         @Override  
  18.         protected void reduce(Text key, Iterable<IntWritable> values, Context context)  
  19.     throws IOException, InterruptedException {  
  20.             }  
  21.         }  
  22.     }  

main函数,是MapReduce进行任务处理的入口。

doMapper类,自定义的Map类

doReducer类,自定义的Reduce类

完整代码如下:

view plain copy
  1. package my.mr;  
  2. import java.io.IOException;  
  3. import java.util.StringTokenizer;  
  4. import org.apache.hadoop.fs.Path;  
  5. import org.apache.hadoop.io.IntWritable;  
  6. import org.apache.hadoop.io.Text;  
  7. import org.apache.hadoop.mapreduce.Job;  
  8. import org.apache.hadoop.mapreduce.Mapper;  
  9. import org.apache.hadoop.mapreduce.Reducer;  
  10. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  11. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  12. public class MyWordCount {  
  13.     public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {  
  14.         Job job = Job.getInstance();  
  15.         job.setJobName("MyWordCount");  
  16.         job.setJarByClass(MyWordCount.class);  
  17.         job.setMapperClass(doMapper.class);  
  18.         job.setReducerClass(doReducer.class);  
  19.         job.setOutputKeyClass(Text.class);  
  20.         job.setOutputValueClass(IntWritable.class);  
  21.         Path in = new Path("hdfs://localhost:9000/mydata/solog");  
  22.         Path out = new Path("hdfs://localhost:9000/myout/1");  
  23.         FileInputFormat.addInputPath(job, in);  
  24.         FileOutputFormat.setOutputPath(job, out);  
  25.         System.exit(job.waitForCompletion(true) ? 0 : 1);  
  26.     }  
  27.     public static class doMapper extends Mapper<Object, Text, Text, IntWritable>{  
  28.         public static final IntWritable one = new IntWritable(1);  
  29.         public static Text word = new Text();  
  30.         @Override  
  31.         protected void map(Object key, Text value, Context context)  
  32.                     throws IOException, InterruptedException {  
  33.             StringTokenizer tokenizer = new StringTokenizer(value.toString(), "\t");  
  34.             if (tokenizer.hasMoreTokens()) {  
  35.                 tokenizer.nextToken();  
  36.                 tokenizer.nextToken();  
  37.                 tokenizer.nextToken();  
  38.                 tokenizer.nextToken();  
  39.             }  
  40.             while (tokenizer.hasMoreTokens()) {  
  41.                 word.set(tokenizer.nextToken());  
  42.                 context.write(word, one);  
  43.             }  
  44.         }  
  45.     }  
  46.     public static class doReducer extends Reducer<Text, IntWritable, Text, IntWritable>{  
  47.         private IntWritable result = new IntWritable();  
  48.         @Override  
  49.         protected void reduce(Text key, Iterable<IntWritable> values, Context context)  
  50.     throws IOException, InterruptedException {  
  51.     int sum = 0;  
  52.     for (IntWritable value : values) {  
  53.     sum += value.get();  
  54.     }  
  55.     result.set(sum);  
  56.     context.write(key, result);  
  57.     }  
  58.     }  
  59.     }  

5、在WordCountText类文件中,右键并点击Run As =》 Run on Hadoop选项,将MapReduce任务提交到Hadoop集群中。

待执行完毕后,进入命令行模式下,查看HDFS目录结构变化

view plain copy
  1. hadoop fs -lsr /myout  

查看HDFS上,/myout/1目录下输出的内容

view plain copy
  1. hadoop fs -text /myout/1/*  

可以看到具体的输出结果

提交报告暂时保存
0 0