hadoop笔记之MapReduce的应用案例(WordCount单词计数)
MapReduce的应用案例(WordCount单词计数)
MapReduce的应用案例(WordCount单词计数)
1. WordCount单词计数
作用:
计算文件中出现每个单词的频数
输入结果按照字母顺序进行排序
Map过程
Reduce过程
WordCount的源代码
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
public class WordCount {
public static class WordCountMap extends
Mapper<LongWritable, Text, Text, IntWritable> {
private final IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer token = new StringTokenizer(line);
while (token.hasMoreTokens()) {
word.set(token.nextToken());
context.write(word, one);
}
}
}
public static class WordCountReduce extends
Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf);
job.setJarByClass(WordCount.class);
job.setJobName("wordcount");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(WordCountMap.class);
job.setReducerClass(WordCountReduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
}
代码解析:
首先是导入各种的相应的类import
开始定义一个类WordCount
public class WordCount{}
在这个类里面包含了两个内置的类,一个叫TokenizerMapper,另一个叫IntSumReducer
public static class TokenizerMapper
public static class IntSumReducer
其中第一个设置了Mapper的输入格式分别是Object(key)和Text(value),输出类型是Text(key)和IntWritable(value)
其中
extends Mapper<Object,Text,Text,IntWritable>{}
这里的one表示单词出现过1次
private final IntWritable one = new IntWritable(1);
接下来就是map操作
public void map(Object key,Text value,Context context)
map操作做一个节段进行分词,如果发现一个词以后就进行写入一个word一个one
word.set(itr.nextToken());
context.write(word,one);
第二个类IntSumReducer,它继承于Reduce接口,设置Reducer的类型是Text和IntWritable,输出类型是Text和IntWritable
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable>{}
Reducer做累加
sum+=val.get();
写好之后有个main函数,用于设置相应的配置文件,包括输入文件目录和输出文件目录,配置作业名字,配置作业中的各个类等等
public static void main(String[] args) throws Exception{}
WordCount单词计数步骤:
- 编写WordCount.java,包含Mapper类和Reducer类
- 编译WordCount.java,
javac -classpath
- 打包jar
-cvf WordCount.jar classes/*
- 作业提交
hadoop jar WordCount.jar WordCount input output
详细:
检查hadoop的运行情况jps
,确定NameNode、DataNode、TaskTracker、Jobtracker、SecondaryNameNode的启动情况
java程序编写
vim WordCount.java
写完之后保存,然后进行编译(因为要动用hadoop里面的一些架包,所以如果用命令行的话要用-classpath进行架包的加入,如果是一些IDE可以直接进行编译)
javac -classpath /opt/hadoop-1.2.1/hadoop-core-1.2.1.jar:/opt/hadoop-1.2.1/lib/commons-cli-1.2.jar -d word_count_class/ WordCount.java
cd word_count_class/
ls
会在word_count_class文件目录下看到三个已经编译好的文件:WordCount.class、WordCount$WordCountMap.class、WordCount$WordCountReduce.class
把编译好的文件打包
jar -cvf wordcount.jar *.class
把原始文件打开WordCount.java,有两个参数输入和输出
FileInputFormat.addInputPath(job,new Path(arg[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
进入输入文件目录cd input/
,在input文件目录下有两个个文件file1、file2,文件内有一些字符串,将file1和file2提交到hadoop里面去
hadoop fs -mkdir input_wordcount
hadoop fs -put input/* input_wordcount/
hadoop fs -ls input_wordcount
hadoop fs -cat input_wordcount/file1
把输入文件上传到hadoop之后就可以提交作业
hadoop jar word_count_class/wordcount.jar WordCount input_wordcount output_wordcount
输入是input_wordcount,输出是output_wordcount,如果没有output_wordcount这个文件夹,那将会新建一个
查看output文件
hadoop fs -ls output_wordcount
注意最后一个文件,例如这里是part-r-00000
hadoop fs -cat output_wordcount/part-r-00000
这就是WordCount单词计数的完整过程,用的是hadoop1.2.1版本
hadoop笔记之MapReduce的应用案例(WordCount单词计数)的更多相关文章
- hadoop笔记之MapReduce的应用案例(利用MapReduce进行排序)
MapReduce的应用案例(利用MapReduce进行排序) MapReduce的应用案例(利用MapReduce进行排序) 思路: Reduce之后直接进行结果合并 具体样例: 程序名:Sort. ...
- hadoop笔记之MapReduce的运行流程
MapReduce的运行流程 MapReduce的运行流程 基本概念: Job&Task:要完成一个作业(Job),就要分成很多个Task,Task又分为MapTask和ReduceTask ...
- hadoop笔记之MapReduce原理
MapReduce原理 MapReduce原理 简单来说就是,一个大任务分成多个小的子任务(map),并行执行后,合并结果(reduce). 例子: 100GB的网站访问日志文件,找出访问次数最多的I ...
- Hadoop WordCount单词计数原理
计算文件中出现每个单词的频数 输入结果按照字母顺序进行排序 编写WordCount.java 包含Mapper类和Reducer类 编译WordCount.java javac -classpath ...
- Spark本地环境实现wordCount单词计数
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6814778610788860424/ 编写类似MapReduce的案例-单词统计WordCount 要统计的文件为 ...
- [spark案例学习] 单词计数
数据准备 数据下载:<莎士比亚全集> 我们先来看看原始数据:首先将数据加载到RDD,然后显示数据框的前15行. shakespeareDF = sqlContext.read.text(f ...
- 每天收获一点点------Hadoop之初始MapReduce
一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大数据量的计算,通常采用的处理手法就是并行计算.但对许多开发者来 ...
- Hadoop MapReduce编程入门案例
Hadoop入门例程简介 一个.有些指令 (1)Hadoop新与旧API差异 新API倾向于使用虚拟课堂(象类),而不是接口.由于这更easy扩展. 比如,能够无需改动类的实现而在虚类中加入一个方法( ...
- 【hadoop代码笔记】Mapreduce shuffle过程之Map输出过程
一.概要描述 shuffle是MapReduce的一个核心过程,因此没有在前面的MapReduce作业提交的过程中描述,而是单独拿出来比较详细的描述. 根据官方的流程图示如下: 本篇文章中只是想尝试从 ...
随机推荐
- idea git 注意事项
1.使用idea进行不同分支切换的时候,一定要先将代码当前分支的代码提交(可以不push),否则当前分支未提交的代码被认为即将切换的代码,在切换过程中会产生冲突. 2.使用idea进行merge的时候 ...
- 视频编解码学习之路(H264)
学习视频编解码技术很难吗?视频编解码技术的未来是什么? 明了的说,无论是软件还是硬件设计,视频编解码技术有很多难点,都需要很长一段时间积累才行. 从一开始接触MPEG-2到最新的H.264标准,可算走 ...
- HTML5新特性学习-2
本文在于巩固基础 HTML5绘图基础 <canvas>画布元素的使用 <div> <canvas id="can" width="200px ...
- VS2015 企业版不支持 JavaScript 语法高亮、智能提醒
2015年7月,微软终于放出了 Visual Studio 2015 正式版,博主安装了 Visual Studio 2015 企业版之后,居然不支持 JavaScript 的语法高亮.智能提醒功能, ...
- zepto 获取select选中的值
jQuery中典型的方法: $('option[selected]') 不管用,因为selected并不是CSS标准. 因此,在zepto中想要获取select元素中选中的option,需采取如下 ...
- iOS中有关配置 Apache 服务器的详细步骤
配置 Apache 服务器 目的: 能够有一个测试的服务器,Apache 服务器是免费的! 为什么是 Apache 使用最广的 Web 服务器 Mac自带,只需要修改几个配置就可以,简单,快捷 有些特 ...
- 屏蔽错误:LNK2038
最近在使用Qt(VS2010编译)的过程中,需要调用COM库,在Qt中加入了QAxContainer模块,是一个LIB库,在把编译模式从Debug改为Release 后链接报告了一堆错误 -1: 错误 ...
- linux 让一个程序开机自启动并把一个程序加为服务
本文以tomcat7为例 首先找到tomcat启动的目录,我的为 cd /usr/local/tomcat7/bin/ 这个目录 启动脚本是startup.sh 然后在/etc/rc.d/rc.loc ...
- Unknown system variable 'tx_read_only'
SpringMVC+SpringDataJPA(1.4.2.RELEASE)+hibernate(4.2.7)+mysql6.0的开发环境,mysql-connector要older than5.1. ...
- lua学习笔记(1)-基本语法
==============变量类型nilnumber(实数) 1 2 3.14 7.65e8string "hello world" "\n ...