WordCount代码实现

实验目的

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、屏幕宽度、屏幕高度、当前搜索词、上一次搜索词)

  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、结果数据样式

  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目录不存在的话,需要提前创建

  1. hadoop fs -mkdir /mydata  

上传文件

  1. hadoop fs -put /data/mydata/solog  /mydata/solog  

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

  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类

完整代码如下:

  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目录结构变化

  1. hadoop fs -lsr /myout  

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

  1. hadoop fs -text /myout/1/*  

可以看到具体的输出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值