前言

  前面以前把关于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概述的更多相关文章

  1. Hadoop MapReduce编程 API入门系列之多个Job迭代式MapReduce运行(十二)

    推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...

  2. hadoop系列四:mapreduce的使用(二)

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  3. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  4. JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

    JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...

  5. Hadoop(二):MapReduce程序(Java)

    Java版本程序开发过程主要包含三个步骤,一是map.reduce程序开发:第二是将程序编译成JAR包:第三使用Hadoop jar命令进行任务提交. 下面拿一个具体的例子进行说明,一个简单的词频统计 ...

  6. 我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  7. hadoop(二MapReduce)

    hadoop(二MapReduce) 介绍 MapReduce:其实就是把数据分开处理后再将数据合在一起. Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理.可以进行拆分的前提是这 ...

  8. hadoop系列三:mapreduce的使用(一)

    转载请在页首明显处注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/7224772.html 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的 ...

  9. Mapreduce概述和WordCount程序

    一.Mapreduce概述 Mapreduce是分布式程序编程框架,也是分布式计算框架,它简化了开发! Mapreduce将用户编写的业务逻辑代码和自带默认组合整合成一个完整的分布式运算程序,并发的运 ...

随机推荐

  1. 201521123090《JAVA程序设计》第二周学习总结

    1. 本章学习总结 java基本数据类型 String类对象使用 枚举类型及switch分支 容器的概念 2. 书面作业 Q1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代 ...

  2. 201521123016 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避 ...

  3. Thinkphp3.2结合phpqrcode生成二维码(含Logo的二维码),附案例

    首先,下载phpqrcode,将其解压到项目ThinkPHP\Library\Vendor目录下.Index_index.html(模板可自行配置) <form action="{:U ...

  4. 【java】聊聊java里的接口

    接口的概念 java中的接口用于描述类应该具备什么样的功能,而不给出具体的实现,一个类可以“实现”多个接口 [注意]接口不是类,而是对类的一组描述   还是让我们通过一个例子来看看接口如何运作吧!   ...

  5. Spring第二篇【Core模块之快速入门、bean创建细节、创建对象】

    前言 上篇Spring博文主要引出了为啥我们需要使用Spring框架,以及大致了解了Spring是分为六大模块的-.本博文主要讲解Spring的core模块! 搭建配置环境 引入jar包 本博文主要是 ...

  6. Java-Filter过滤器用于过滤整个项目的编码

    整个分为实现类以及在web.xml文件中对编写的filter类进行注册 代码如下 package cn.itcast.itcaststore.web.filter; import java.io.IO ...

  7. 西邮linux兴趣小组2014纳新免试题(五)

    [第五关] 题目 http://final5.sinaapp.com/ 关注西邮Linux微信平台,得到一个名为a的文件 分析 分析文件a 需要反汇编,拿IDA上,打开后发现key_function及 ...

  8. crontab的两大坑:百分号和环境变量

    今天想给服务器加个自动备份mysql数据库的功能(别怪我这么久才加,阿里云每天全盘备份的,不怕丢数据库),本以为只要5分钟就能搞定的,结果入了两个大坑. 我的crontab是这样写的: * * * m ...

  9. 线段树专题—ZOJ1610 Count the Colors(涂区间,直接tag标记)

    Painting some colored segments on a line, some previously painted segments may be covered by some th ...

  10. vue2购物车ch1-(安装依赖、简单配置、 axios获取api的模拟数据)

    0--项目说明 说明此项目源自某课网购物车教程,但是在开发过程中,发现在开发过程中用的还是 vue-resource(宣布不更新的类$.ajx()插件),为了以后的发展使用axios.js,详情参考 ...