设为首页 收藏本站
查看: 1080|回复: 0

[经验分享] Hadoop(十二)MapReduce概述

[复制链接]

尚未签到

发表于 2017-12-16 21:44:37 | 显示全部楼层 |阅读模式
  前言
  前面以前把关于HDFS集群的所有知识给讲解完了,接下来给大家分享的是MapReduce这个Hadoop的并行计算框架。

一、背景
  1)爆炸性增长的Web规模数据量
DSC0000.png

  2)超大的计算量/计算复杂度
DSC0001.png

  3)并行计算大趋所势
DSC0002.png


二、大数据的并行计算
  1)一个大数据若可以分为具有同样计算过程的数据块,并且这些数据块之间不存在数据依赖关系,则提高处理速度最好的办法就是并行计算。
DSC0003.png

  2)大数据并行计算
DSC0004.png


三、Hadoop的MapReduce概述

3.1、需要MapReduce原因
DSC0005.png


3.2、MapReduce简介 
  1)产生MapReduce背景
DSC0006.png

  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两个抽象的编程接口。由用户去编程实现:
DSC0007.png

  注意:Map是一行一行去处理数据的。
  2)详细的处理过程
DSC0008.png


四、编写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是引用的次数。
  画图分析:
DSC0009.png


4.3、代码实现
  1)编写一个解析类,用来解析数据文件中一行一行的数据。
  

import org.apache.hadoop.io.Text;  

  

public>
//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==2){
  
patentId = strs[0].trim();
  
refPatentId = strs[1].trim();
  
if (patentId.length()>0&&refPatentId.length()>0){
  
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>
  

//-Dinput=/data/patent/cite75_99.txt
  
public static>  
extends Mapper<LongWritable,Text,Text,IntWritable>{
  
private PatentRecordParser parser = new PatentRecordParser();
  
private  Text key = new Text();
  
//把进入reduce的value都设置成1
  
private IntWritable value = new IntWritable(1);
  

  
//进入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>  
extends Reducer<Text,IntWritable,Text,IntWritable>{
  

  
@Override
  
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  
int count = 0;
  
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)?0:1;
  
}
  

  
public static void main(String[] args) throws Exception {
  
System.exit(
  
ToolRunner.run(new PatentReference_0011(),args)
  
);;
  
}
  
}
  

  3)使用Maven打包好,上传到安装配置好集群客户端的Linux服务器中
  4)运行测试
DSC00010.png

  执行上面的语句,注意指定输出路径的时候,一定是集群中的路径并且目录要预先不存在,因为程序会自动去创建这个目录。
  5)然后我们可以去Web控制页面去观察htttp://ip:8088去查看作业的进度
  喜欢就点“推荐”哦! 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424844-1-1.html 上篇帖子: 从零自学Hadoop(24):Impala相关操作上 下篇帖子: Hadoop(九)Hadoop IO之Compression和Codecs
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表