使用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 ...
随机推荐
- Spring Cloud 系列之 Dubbo RPC 通信
Dubbo 介绍 官网:http://dubbo.apache.org/zh-cn/ Github:https://github.com/apache/dubbo 2018 年 2 月 15 日,阿里 ...
- Docker镜像命令笔记
docker安装 官方Ubuntu安装文档 获取 docker pull NAME[:TAG] docker pull registry.docker-cn.com/library/ubuntu:14 ...
- opencv c++访问某一区域
int main(){ cv::Mat m1(,, CV_8UC1); for(int i=;i<m1.rows;++i) for(int j=;j<m1.cols;++j) m1.at& ...
- logback.xml 不能被加载,logback不能被执行,logback.xml 无法生效,slf4j日志样式输出失败
1. 原因 logback.xml 无法被加载, 尝试了好久还是失败,哎,最后新建工程竟然可以,所以说还是项目的问题: 原来项目依赖了两个slf4j.jar,是版本冲突了: 2. 查找原因 idea ...
- 个人作业——软件工程实践总结&个人技术博客
一. 回望 (1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强软件工程专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪 ...
- TCP协议粘包问题详解
TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...
- ajax前后端交互原理(3)
3.HTTP服务器 3.3.相关前置知识 1 什么是url? 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的UR ...
- cp5200的一般步骤
cp5200的一般步骤: 1.创建数据对象 hObj = CP5200_CommData_Create(nCommType, id, GetIDCode()); 2.生成所需要的数据,如 :生成设置亮 ...
- 调用微信内置的方法及wx.config的配置问题
首先请看网址: https://www.w3cschool.cn/weixinkaifawendang/h8ap1qe5.html 重点说下怎么配置wx.config(为了安全,所有的参数都在服务端获 ...
- 恕我直言你可能真的不会java第11篇-Stream API终端操作
一.Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API.在使用的过程中分为三个阶段.在开始本文之前 ...