使用MapReduce运行WordCount案例
@
一、准备数据
注意:准备的数据的格式必须是文本,每个单词之间使用制表符分割。编码必须是utf-8无bom
二、MR的编程规范
MR的编程只需要将自定义的组件和系统默认组件进行组合,组合之后运行即可!
三、编程步骤
①Map阶段的核心处理逻辑需要编写在Mapper
中
②Reduce阶段的核心处理逻辑需要编写在Reducer
中
③将编写的Mapper和Reducer进行组合,组合成一个Job
④对Job进行设置,设置后运行
四、编写程序
WCMapper.java
public class WCMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
private Text out_key=new Text();
private IntWritable out_value=new IntWritable(1);//每个单词出现一次记为1
// 针对输入的每个 keyin-valuein调用一次 (0,hello hi hello hi)
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws Exception {
System.out.println("keyin:"+key+"----keyout:"+value);
String[] words = value.toString().split("\t");
for (String word : words) {
out_key.set(word);
//写出数据(单词,1)
context.write(out_key, out_value);
}
}
}
Mapper程序解读
导包时,需注意导入
org.apache.hadoop.mapreduce
包下的类(hadoop2.0的新api)自定义的类必须符合MR的Mapper的规范
在MR中,只能处理
key-value
格式的数据
KEYIN, VALUEIN
: mapper输入
的k-v类型,由当前Job的InputFormat的RecordReader
决定!封装输入的key-value由RecordReader自动进行,不可自定义。
KEYOUT, VALUEOUT
: mapper输出
的k-v类型,可自定义InputFormat
的作用:
①验证输入目录中的文件格式,是否符合当前Job的要求
②生成切片,每个切片都会交给一个MapTask
处理
③提供RecordReader,由RR从切片中读取记录,交给Mapper进行处理
方法: List<InputSplit> getSplits
: 切片
RecordReader<K,V> createRecordReader
: 创建RecordReader
默认hadoop使用的是TextInputFormat
,TextInputFormat使用LineRecordReader
- 在Hadoop中,如果有Reduce阶段。通常key-value都需要实现序列化协议!
MapTask处理后的key-value,只是一个阶段性的结果!
这些key-value需要传输到ReduceTask所在的机器!
将一个对象通过序列化技术,序列化到一个文件中,经过网络传输到另外一台机器,
再使用反序列化技术,从文件中读取数据,还原为对象是最快捷的方式!
java的序列化协议: Serializable
特点:不仅保存对象的属性值,类型,还会保存大量的包的结构,子父类和接口的继承信息,很笨重。
hadoop开发了一款轻量级的序列化协议: Writable
机制!
WCReducer.java
/*
*KEYIN, VALUEIN: Mapper输出的keyout-valueout
*KEYOUT, VALUEOUT: 自定义
*/
public class WCReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
private IntWritable out_value=new IntWritable();
// reduce一次处理一组数据,key相同的视为一组
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws Exception {
int sum=0;
for (IntWritable intWritable : values) {
sum += intWritable.get();
}
out_value.set(sum);
//将累加的值写出
context.write(key, out_value);
}
}
WCDriver.java
/*
* 1.启动这个线程,运行Job
*
* 2.本地模式主要用于测试程序是否正确!
*/
public class WCDriver {
public static void main(String[] args) throws Exception {
//默认使用本地的文件系统
Path inputPath=new Path("e:/mrinput/wordcount");
Path outputPath=new Path("e:/mroutput/wordcount");
/*Path inputPath=new Path("/wordcount");
Path outputPath=new Path("/mroutput/wordcount");*/
//作为整个Job的配置
Configuration conf = new Configuration();
//使用HDFS
/*conf.set("fs.defaultFS", "hdfs://hadoop101:9000");
// 在YARN上运行
conf.set("mapreduce.framework.name", "yarn");
// RM所在的机器
conf.set("yarn.resourcemanager.hostname", "hadoop102");*/
//一定要保证输出目录不存在
FileSystem fs=FileSystem.get(conf);
if (fs.exists(outputPath)) {
fs.delete(outputPath, true);
}
// ①创建Job
Job job = Job.getInstance(conf);
// 告诉NM运行时,MR中Job所在的Jar包在哪里
//job.setJar("MapReduce-0.0.1-SNAPSHOT.jar");
// 将某个类所在地jar包作为job的jar包
job.setJarByClass(WCDriver.class);
// 为Job创建一个名字
job.setJobName("wordcount");
// ②设置Job
// 设置Job运行的Mapper,Reducer类型,Mapper,Reducer输出的key-value类型
job.setMapperClass(WCMapper.class);
job.setReducerClass(WCReducer.class);
// Job需要根据Mapper和Reducer输出的Key-value类型准备序列化器,通过序列化器对输出的key-value进行序列化和反序列化
// 如果Mapper和Reducer输出的Key-value类型一致,直接设置Job最终的输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
// 设置输入目录和输出目录
FileInputFormat.setInputPaths(job, inputPath);
FileOutputFormat.setOutputPath(job, outputPath);
// ③运行Job
job.waitForCompletion(true);
}
}
使用MapReduce运行WordCount案例的更多相关文章
- python在mapreduce运行Wordcount程序
首先脚本文件: mapper.py: #!/usr/bin/env python import sys for line in sys.stdin: line = line.strip() words ...
- MapReduce简单执行过程及Wordcount案例
MapReducer运行过程 以单词统计为案例. 假如现在文件中存在如下内容: aa bb aa cc dd aa 当然,这是小文件,如果文件大小较大时会将文件进行 "切片" ,此 ...
- hadoop笔记之MapReduce的应用案例(WordCount单词计数)
MapReduce的应用案例(WordCount单词计数) MapReduce的应用案例(WordCount单词计数) 1. WordCount单词计数 作用: 计算文件中出现每个单词的频数 输入结果 ...
- hadoop学习笔记:运行wordcount对文件字符串进行统计案例
文/朱季谦 我最近使用四台Centos虚拟机搭建了一套分布式hadoop环境,简单模拟了线上上的hadoop真实分布式集群,主要用于业余学习大数据相关体系. 其中,一台服务器作为NameNode,一台 ...
- 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)
0.前言 0.1 分布式运算框架的核心思想(此处以MR运行在yarn上为例) 提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...
- hadoop2.7.x运行wordcount程序卡住在INFO mapreduce.Job: Running job:job _1469603958907_0002
一.抛出问题 Hadoop集群(全分布式)配置好后,运行wordcount程序测试,发现每次运行都会卡住在Running job处,然后程序就呈现出卡死的状态. wordcount运行命令:[hado ...
- eclipse运行mapreduce的wordcount
1,eclipse安装hadoop插件 插件下载地址:链接: https://pan.baidu.com/s/1U4_6kLFNiKeLsGfO7ahXew 提取码: as9e 下载hadoop-ec ...
- MapReduce 单词统计案例编程
MapReduce 单词统计案例编程 一.在Linux环境安装Eclipse软件 1. 解压tar包 下载安装包eclipse-jee-kepler-SR1-linux-gtk-x86_64.ta ...
- 021_在Eclipse Indigo中安装插件hadoop-eclipse-plugin-1.2.1.jar,直接运行wordcount程序
1.工具介绍 Eclipse Idigo.JDK1.7-32bit.hadoop1.2.1.hadoop-eclipse-plugin-1.2.1.jar(自己网上下载) 2.插件安装步骤 1)将ha ...
随机推荐
- 增值税发票税控开票软件助手Excel、ERP、SAP导入开票接口进行批量开票操作手册
写这遍文章的目的是方便以后个人使用,做个笔记记录. 首先我来说一下它是做什么用的,它的主要作用是把用户的开票数据,Excel数据.ERP 系统.SAP导入到增值税发票税控开票软件中,可用航信盘.百旺盘 ...
- 初见NVelocity模板引擎
//using NVelocity.App; //using NVelocity; //using NVelocity.Runtime; VelocityEngine vltEngine = new ...
- AOP的概念
1.1 什么是AOP? 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.软件开发的目的,最终是为了解决各种需求,包括业务需求和系统需求.使用面向对象方法,我们可以对业务需求等普通关注点进行很好 ...
- 关于word2vec的一些问题
CBOW v.s. skip-gram CBOW 上下文预测中心词,出现次数少的词会被平滑,对出现频繁的词有更高的准确率 skip-gram 中心词预测上下文,训练次数比CBOW多,表示罕见词更好 例 ...
- Python实用笔记 (9)高级特性——列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, ...
- Python3笔记008 - 2.5 运算符
第2章 python语言基础 运算符:是一些特殊的符号,主要用于数学计算等. 表达式:使用运算符将不同类型的数据按照一定的规则连接起来的式子. 分类:算术运算符.赋值运算符.比较运算符.逻辑运算符.位 ...
- NOIp ( on line ) 提高组 2020 总结
T1 : 序列 题意: 一共有T组数据,每组数据有两个长度为n的序列a,b,m个操作,问a序列是否可以转换成b,是输出YES,否的话输出NO. m个操作分别为ti,xi,yi,若t为1,则x和y上的数 ...
- (私人收藏)古风PPT高级灰蓝传艺
古风PPT高级灰蓝传艺 https://pan.baidu.com/s/1ADgTfif8i6JqKORLXhTHHgn05p
- a标签绑定点击事件失败
如图 然后对a标签绑定点击事件 无效 换成span标签可以
- JVM内存管理——总结篇
JVM内存管理--总结篇 自动内存管理--总结篇 内存划分及作用 常见问题 内存划分及作用 程序计数器 线程私有.字节码行号指示器. 执行Java方法,计数器记录的是字节码指令地址:执行本地(Nati ...