WordCount——MapReduce 实例入门
本文我们从一个简单的实例出发,统计文本中不同单词出现的次数,来讲述 MapReduce 的执行流程。
考虑如下的文本信息(文件名为hello
):
hello you
hello me
MapReduce 工作流程
(1) [K1, V1]:将输入文本的每一行,解析成一个 key、value 对
键:当前文本行的首地址,则第一行的首地址为
0
,则第二行的首地址为10
(第一行的换行也站一个字节)。值:当前文本行文本 内容。
第一步解析为:[0, hello you]、[10, hello me]
每一个键值对调用一次 Map 函数,则就会调用两次 Map 函数
(2)Map:[K1, V1] ⇒ [K2, V2]
Map 函数接受的是每一行的文本信息,它无法获取所有行的内容,自然它处理的也是一个单独的文本行的内容,对本例而言也即统计当前行中单词出现的次数;
public void map(K, V, ctx){String[] splited = v.split("\t");for (String word: splited){ctx.write(<word, 1>);// 向上下文中写数据} }
本例而言:
<hello, 1>, <you, 1>, <hello, 1>, <me, 1>
(3)默认为1个分区
(4)先排序再分组,将相同 key (实现了 Comparable 接口的 compareTo 方法)的不同 values 置于一个集合中
先排序:
<hello, 1>, <hello, 1>, <me, 1>, <you, 1>
分组:<hello, {1, 1}>, <me, 1>, <you, 1>
(5)规约
(6)拷贝到 Reducer 所在的节点
属于框架的工作;
(7)Reduce
本例而言,reduce被调用三次;
public void reduce(K, Vs, ctx){ctx.write(K, Vs.size()); }
(8)保存结果
<hello, 2>, <me, 1>, <you, 1>
如何以 MapReduce 的思维处理业务
(1)在MapReduce中流转的是键值对
input ⇒ <K1, V1> ⇒ <K2, V2> ⇒ <K2, V2s> ⇒ <K3, V3>
(2)客户输入的文本信息提供了
<K1, V1>
,客户的要求给定了<K3, V3>
(<K2、V2>
在 Map 产生,在 Reduce 步被消灭)(3)使用 MapReduce 的核心就在于确定
<K2, V2>
,如何确定K2, V2
呢:- (1)分组:把相同 key 的 values 放在一起
- (2)Reduce 函数
代码实现
package mr;import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;public class WordCount {static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{@Overrideprotected void map(LongWritable k1, Text v1,Mapper<LongWritable, Text, Text, LongWritable>.Context ctx)throws IOException, InterruptedException {String[] splits = v1.toString().split(" ");for (String word: splits)ctx.write(new Text(word), new LongWritable(1L));}} static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>{@Overrideprotected void reduce(Text k2, Iterable<LongWritable> v2s,Reducer<Text, LongWritable, Text, LongWritable>.Context ctx)throws IOException, InterruptedException {long cnt = 0L;for (LongWritable v2 : v2s) {cnt += v2.get();}ctx.write(k2, new LongWritable(cnt));}}private static final String INPUT_PATH = "hdfs://hadoop0:9000/hello";private static final String OUTPUI_PATH = "hdfs://hadoop0:9000/hello_res";public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = new Job(conf, WordCount.class.getSimpleName());// step 1: 输入 ==> <K1, V1>// 向任务传递输入文件FileInputFormat.setInputPaths(job, INPUT_PATH);// 指定对输入文件进行格式化处理的类job.setInputFormatClass(TextInputFormat.class);// 注意:FileInputFormat TextInputFormat 包的选择// 步骤可省// step 2: <K1, V1> ==> <K2, V2>job.setMapperClass(MyMapper.class);// 指定map输出的<K, V>类型,如果<K3, V3> 与 <K2, V2>的类型一致,以下的两个设置也是可省的job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);// step 3: 分区job.setPartitionerClass(HashPartitioner.class);job.setNumReduceTasks(1);// 以上两个设置均可省略// 也即以上两个操作都是默认操作// step 4: 排序、分组// step 5:规约// step 2.1// step 2.2:指定自定义Reducer类job.setReducerClass(MyReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);// step 2.3: 指定输出路径FileOutputFormat.setOutputPath(job, new Path(OUTPUI_PATH));// 指定对输出结果进行格式化处理的类job.setOutputFormatClass(TextOutputFormat.class);// 此步可省// 将作业提交给 JobTrackerjob.waitForCompletion(true);}
}
在启动hadoop的之后,运行该程序时,可能会报权限异常,将 FileUtil 解压拷贝到当前目录再次运行即顺利执行。
WordCount——MapReduce 实例入门相关推荐
- 学习笔记Hadoop(十四)—— MapReduce开发入门(2)—— MapReduce API介绍、MapReduce实例
四.MapReduce API介绍 一般MapReduce都是由Mapper, Reducer 及main 函数组成. Mapper程序一般完成键值对映射操作; Reducer 程序一般完成键值对聚合 ...
- 大数据之hadoop伪集群搭建与MapReduce编程入门
一.理论知识预热 一句话介绍hadoop: Hadoop的核心由分布式文件系统HDFS与Map/Reduce计算模型组成. (1)HDFS分布式文件系统 HDFS由三个角色构成: 1)NameNode ...
- Hadoop环境搭建测试以及MapReduce实例实现
目录 1 任务 2 过程 2.1 熟悉常用的 Hadoop 命令 2.2 Hadoop环境搭建 1.SSH登录权限设置 2.安装Java环境 3.Hadoop的安装 4.伪分布式安装配置 2.3 Wo ...
- Hadoop之mapreduce 实例三
Hadoop之mapreduce 实例三 转载于:https://www.cnblogs.com/chaoren399/archive/2013/01/04/2844503.html
- 微信公众平台开发教程(四) 实例入门:机器人(附源码)
微信公众平台开发教程(四) 实例入门:机器人(附源码) 上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团. 一.功能介绍 通过微信公众平台实现在 ...
- 单片机独立式按键c语言程序,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询)...
(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询) /************************************************************ ...
- 《Hadoop MapReduce实战手册》一1.4 给WordCount MapReduce程序增加combiner步骤
本节书摘来异步社区<Hadoop MapReduce实战手册>一书中的第1章,第1.4节,作者: [美]Srinath Perera , Thilina Gunarathne 译者: 杨卓 ...
- 矩阵键盘逐行扫描C语言,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf...
(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf /***************************************************** ...
- pygame游戏实例入门
pygame游戏实例入门 开发环境 第三方库安装 任务介绍 大概实现思路 具体实现流程 游戏背景界面 猴子类 猴子类编写 猴子类运行 香蕉类 香蕉类编写 香蕉类运行 综合编写及碰撞检测 总结 开发环境 ...
最新文章
- 用Leangoo管理你的项目
- mysql中拼接用什么_MySQL中常用的拼接语句的小结(代码示例)
- 美国-5大牛校--8条小牛--14好校--18很不错的大学
- Arduino数字引脚作为GPIO的使用
- 如何读取服务器的文件夹大小,请教如何获取outlook文件夹对话框中服务器数据大小?...
- Windows API的时间结构体、时间转换及时间获取
- 随便说说---java初级学习路线
- @PostConstruct注解学习,最详细的分享教程
- rdd分片 spark_Spark分区
- java id自增_Java分布式自增长ID实现方案
- cortana 无法使用_如何使用Cortana创建和编辑列表(并将它们与Wunderlist同步)
- 基于FPGA的帧差法仿真实现
- w10安装ubuntu_记 Win10 + Ubuntu 双系统安装
- 解除微信授权的html5网页,微信授权登录网页管理在哪里看?如何取消授权
- 采用Windows PowerShell运行conda activate xx出现 C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1报错问题
- Parameterize Method (令函数携带参数)
- 转:陈佩斯曝光春晚背后种种肮脏行径
- 解决AMD Software提示图形驱动版本不匹配问题
- MyBatis SSM
- lombok小辣椒的使用
热门文章
- win10基于anaconda下的tensorflow2.0.0及cuda10.0、cudnn安装成功
- Linux下性能压测工具WRK,性能测试神器 wrk 使用教程
- Python之 类属性和类方法
- Mysql集群拆分_MySQL 5.7跨集群拆分迁移
- 为什么普通红包自己不能领_为什么窗帘不能用洗衣机洗呢?千万别让窗帘砸在自己手里!...
- 西安石油大学计算机学院于晓,西安石油大学计算机学院2009届本科毕业设计答辩.doc...
- php如何修改xml中的数据,php如何修改xml内容
- Java动态规划求最长公共子序列(LCS)
- 探索软件设计模式(二)
- (5)【整合】基于机器学习的酒店评论文本倾向性分析