Hadoop(十二)MapReduce概述
前言
前面以前把关于HDFS集群的所有知识给讲解完了,接下来给大家分享的是MapReduce这个Hadoop的并行计算框架。
一、背景
1)爆炸性增长的Web规模数据量
2)超大的计算量/计算复杂度
3)并行计算大趋所势
二、大数据的并行计算
1)一个大数据若可以分为具有同样计算过程的数据块,并且这些数据块之间不存在数据依赖关系,则提高处理速度最好的办法就是并行计算。
2)大数据并行计算
三、Hadoop的MapReduce概述
3.1、需要MapReduce原因
3.2、MapReduce简介
1)产生MapReduce背景
2)整体认识
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,用于解决海量数据的计算问题。
MapReduce分成了两个部分:
1)映射(Mapping)对集合里的每个目标应用同一个操作。即,如果你想把表单里每个单元格乘以二,那么把这个函数单独地应用在每个单元格上的操作就属于mapping。
2)化简(Reducing)遍历集合中的元素来返回一个综合的结果。即,输出表单里一列数字的和这个任务属于reducing。
你向MapReduce框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map任务,然后分配到不同的节点上去执行,
每一个Map任务处理输入数据中的一部分,当Map任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce任务的输入数据。
Reduce任务的主要目标就是把前面若干个Map的输出汇总到一起并输出。
MapReduce的伟大之处就在于编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
3.3、MapReduce编程模型
1)MapReduce借鉴了函数式程序设计语言Lisp中的思想,定义了如下的Map和Reduce两个抽象的编程接口。由用户去编程实现:
注意:Map是一行一行去处理数据的。
2)详细的处理过程
四、编写MapReduce程序
4.1、数据样式与环境
1)环境
我使用的是Maven,前面 有我配置的pom.xml文件。
2)数据样式
这是一个专利引用文件,格式是这样的:
专利ID:被引用专利ID
1,2
1,3
2,3
3,4
2,4
4.2、需求分析
1)需求
计算出被引用专利的次数
2)分析
从上面的数据分析出,我们需要的是一行数据中的后一个数据。分析一下:
在map函数中,输入端v1代表的是一行数据,输出端的k2可以代表是被引用的专利,在一行数据中所以v2可以被赋予为1。
在reduce函数中,k2还是被引用的专利,而[v2]是一个数据集,这里是将k2相同的键的v2数据合并起来。最后输出的是自己需要的数据k3代表的是被引用的专利,v3是引用的次数。
画图分析:
4.3、代码实现
1)编写一个解析类,用来解析数据文件中一行一行的数据。
import org.apache.hadoop.io.Text; public class PatentRecordParser {
//1,2
//1,3
//2,3
//表示数据中的第一列
private String patentId;
//表示数据中的第二列
private String refPatentId;
//表示解析的当前行的数据是否有效
private boolean valid; public void parse(String line){
String[] strs = line.split(",");
if (strs.length==){
patentId = strs[].trim();
refPatentId = strs[].trim();
if (patentId.length()>&&refPatentId.length()>){
valid = true;
}
}
} public void parse(Text line){
parse(line.toString());
} public String getPatentId() {
return patentId;
} public void setPatentId(String patentId) {
this.patentId = patentId;
} public String getRefPatentId() {
return refPatentId;
} public void setRefPatentId(String refPatentId) {
this.refPatentId = refPatentId;
} public boolean isValid() {
return valid;
} public void setValid(boolean valid) {
this.valid = valid;
}
}
2)编写PatentReference_0011去实现真正的计算
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; import java.io.IOException; public class PatentReference_0011 extends Configured implements Tool { //-Dinput=/data/patent/cite75_99.txt
public static class PatentMapper
extends Mapper<LongWritable,Text,Text,IntWritable>{
private PatentRecordParser parser = new PatentRecordParser();
private Text key = new Text();
//把进入reduce的value都设置成1
private IntWritable value = new IntWritable(); //进入map端的数据,每次进入一行。
//MapReduce都是具有一定结构的数据,有一定含义的数据。
//进入时候map的k1(该行数据首个字符距离整个文档首个字符的距离),v1(这行数据的字符串)
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
parser.parse(value);
if (parser.isValid()){
this.key.set(parser.getRefPatentId());
context.write(this.key,this.value);
}
}
} public static class PatentReducer
extends Reducer<Text,IntWritable,Text,IntWritable>{ @Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count = ;
for (IntWritable iw:values){
count+=iw.get();
}
context.write(key,new IntWritable(count));
//注意:在map或reduce上面的打印语句是没有办法输出的,但会记录到日志文件当中。
}
}
@Override
public int run(String[] args) throws Exception {
//构建作业所处理的数据的输入输出路径
Configuration conf = getConf();
Path input = new Path(conf.get("input"));
Path output = new Path(conf.get("output"));
//构建作业配置
Job job = Job.getInstance(conf,this.getClass().getSimpleName()+"Lance");//如果不指定取的名字就是当前类的类全名 //设置该作业所要执行的类
job.setJarByClass(this.getClass()); //设置自定义的Mapper类以及Map端数据输出时的类型
job.setMapperClass(PatentMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); //设置自定义的Reducer类以及输出时的类型
job.setReducerClass(PatentReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); //设置读取最原始数据的格式信息以及
//数据输出到HDFS集群中的格式信息
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class); //设置数据读入和写出的路径到相关的Format类中
TextInputFormat.addInputPath(job,input);
TextOutputFormat.setOutputPath(job,output); //提交作业
return job.waitForCompletion(true)?:;
} public static void main(String[] args) throws Exception {
System.exit(
ToolRunner.run(new PatentReference_0011(),args)
);;
}
}
3)使用Maven打包好,上传到安装配置好集群客户端的Linux服务器中
4)运行测试
执行上面的语句,注意指定输出路径的时候,一定是集群中的路径并且目录要预先不存在,因为程序会自动去创建这个目录。
5)然后我们可以去Web控制页面去观察htttp://ip:8088去查看作业的进度
喜欢就点“推荐”哦!
Hadoop(十二)MapReduce概述的更多相关文章
- Hadoop MapReduce编程 API入门系列之多个Job迭代式MapReduce运行(十二)
推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...
- hadoop系列四:mapreduce的使用(二)
转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习
JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...
- Hadoop(二):MapReduce程序(Java)
Java版本程序开发过程主要包含三个步骤,一是map.reduce程序开发:第二是将程序编译成JAR包:第三使用Hadoop jar命令进行任务提交. 下面拿一个具体的例子进行说明,一个简单的词频统计 ...
- 我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- hadoop(二MapReduce)
hadoop(二MapReduce) 介绍 MapReduce:其实就是把数据分开处理后再将数据合在一起. Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理.可以进行拆分的前提是这 ...
- hadoop系列三:mapreduce的使用(一)
转载请在页首明显处注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/7224772.html 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的 ...
- Mapreduce概述和WordCount程序
一.Mapreduce概述 Mapreduce是分布式程序编程框架,也是分布式计算框架,它简化了开发! Mapreduce将用户编写的业务逻辑代码和自带默认组合整合成一个完整的分布式运算程序,并发的运 ...
随机推荐
- Python的自学之路:Python基础(一)
声明:我写博客不是为了什么,只是为了记录自己的学习状态,学过的知识点!方便以后进行好的复习!python小白,勿喷 python环境的搭建,在这里就不细说了,这里有我的链接,可以参考一下:https: ...
- linux c函数指针的应用
头文件:1.h #include<stdio.h> int nul_func(); int test1(int a,int b); int test2(int a,int b,int c) ...
- Lucene第一篇【介绍Lucene、快速入门】
什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引 ...
- [5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)
1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...
- virtualbox修改主机名
virtualbox修改主机名 /etc/hostname /etc/hosts
- 二叉树终极教程--BinarySearchTree
BinarySearchTreeMap 的 实现 public interface Map<K extends Comparable<K>, V> { void put(K k ...
- Node.js 异步异闻录
本文首发在个人博客:http://muyunyun.cn/posts/7b9fdc87/ 提到 Node.js, 我们脑海就会浮现异步.非阻塞.单线程等关键词,进一步我们还会想到 buffer.模块机 ...
- appium 原理解析
Appium是 c/s模式的appium是基于 webdriver 协议添加对移动设备自化api扩展而成的webdriver 是基于 http协议的,第一连接会建立个 session 会话,并通过 p ...
- Java编程 “提高性能” 应尽力做到
除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Java编程中尽可能要做到的 ...
- 最接近原生APP体验的高性能前端框架-MUI
前 言 轻量,原生UI,流畅体验,是MUI的三个特征. 1. 新手指南 快速体验 1. 下载Hello mui App 下载已打包好的Hello mui 手机app,直接在手机上体验mui的 ...