【第22期】观点:IT 行业加班,到底有没有价值?

WordCount代码实现

翻译 2017年01月03日 16:40:17

实验目的

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/*  

可以看到具体的输出结果

举报

相关文章推荐

redis发布订阅java代码实现

具体源码:这里写链接内容发布订阅概念: 订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频...

spark eclipse写wordcount

安装spark,见上文 http://blackproof.iteye.com/blog/2182393   配置window开发环境 window安装scala <p style

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

简单的单词个数统计的mapreduce 的代码实现

简单的单词个数统计的mapreduce 的代码实现的解读 数据格式如下 hello tom hello jerry hello kitty hello world hello tom 5...

Spark集群中WordCount运行原理

以数据流动的视角解释一下wordcount运行的原理 [code="java"] package com.imf.spark.wordcount import org.apache.spark.{SparkContext, SparkConf} /** ...

用代码实现二叉树的遍历-Java经典面试题算法部分核心

树的特征: 都有根节点:根节点指的是最上面的一个节点 当孩子节点没有孩子,我们称这样的孩子称为叶子节点 在一棵树中,纵向最长的长度为数的深度 当一棵树每一个节点的孩子不超过2个,我们称这棵树为...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)