使用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 ...
随机推荐
- (四)Maven项目工程目录约定
使用maven创建的工程我们称它为maven工程,maven工程具有一定的目录规范,如下: src/main/java 存放项目的.java文件 src/main/resources 存放项目资源文件 ...
- ULVAC爱发科皮拉尼真空计SW1-N说明书-手册
ULVAC爱发科皮拉尼真空计SW1-N1/N2/N SWP-16-N/传感器单元规管 https://wenku.baidu.com/view/cff03803a6c30c2259019ef5.htm ...
- Linux系统结构详解(转)
Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...
- Redis五种数据类型应用场景
目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...
- springBoot--集成RocketMQ
1.导入依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>sprin ...
- python将指定目录下的所有文件夹用随机数重命名
我的目的在于打乱数据顺序,便于GAN训练: import random import os path = 'hunhe_7' #目标文件夹 listname = os.listdir(path) #遍 ...
- dart快速入门教程 (1)
1.环境搭建 1.1.dart简介 Dart 是一种 易于学习. 易于扩展.并且可以部署到 任何地方 的 应用 编程 语言.Google 使用 Dart 来开发 大型应用.flutter使用dart语 ...
- 洛谷 P2298 【Mzc和男家丁的游戏 】
这道题还是挺水的,广搜模板题,注意一下细节就是了. :码代上上代码: #include <bits/stdc++.h> using namespace std; int n , m , s ...
- Python3笔记001 - 1.1 python概述
第1章 认识python python语言特点 跨平台 开源的 解释型 面向对象 python语言的特点是:以对象为核心组织代码,支持多种编程范式,采用动态类型,自动进行内存回收,并能调用C语言库进行 ...
- PHPstorm快捷键的学习
1.Ctrl + 空格 当输入代码时,PHPstorm 会自动出现联想选项. 但是,如果在输入时联想时错过了选择,我们要想让他再一次出现联想,通常采用的方法是在先前的输入后面再输入字符,这时联想又会出 ...