Hadoop MapReduce概述
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Hadoop MapReduce的设计目标
1>.什么是Hadoop MapReduce
Hadoop MapReduce是一个分布式运算程序的编程框架,是用户开发"基于Hadoop的数据分析应用"的核心框架。
Hadoop MapReduce诞生于搜索领域,主要解决搜索引擎命令的海量数据处理扩展性差的问题。它的实现很大程度借鉴了Google的MapReduce的设计思想,包括监控编程就接口,提高系统容错性等。
Hadoop MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个头Hadoop集群上。
2>.Hadpoop MapReduce的优点(设计目标)
易于编程:
传统的分布式程序设计(如MPI)非常复杂,用户需要关注的细节非常多,比如数据分片,数据传输,节点间通信等,因而设计分布式程序的门槛非常高。
MapReduce的一个重要设计目标便是简化分布式程序设计。
它将于并行程序逻辑无关的设计细节抽象成公共模块并交由系统实现,而用户只需专注于自己的应用程序逻辑实现,这样简化了分布式程序设计且提高了开发效率。
良好的扩展性:
随着业务的发展,积累的数据量(如搜索公司的网页量)会越来越大,当数据量增加到一定程度后,现有集群可能已经无法满足其计算和存储需求,这时候管理员可能期望通过添加机器以达到线性扩展集群能力的目的。
高容错性:
在分布式环境下,随着集群规模的增加,集群中的故障(比如磁盘损坏,机器宕机,节点通信失败等硬件故障和用户程序Bug产生的软件故障)次数会显著增加,进而导致任务和数据丢失的可能性增加。
未避免上述问题,Hadoop MapReduce通过计算迁移或者数据迁移等策略提高集群的可用性和容错性。
高吞吐率:
一个分布式系统通常需要在高吞吐率和低延迟之间做权衡,而MapReduce计算引擎则选择了高吞吐率。
MapReduce通过分布式并行技术,能够利用多机资源,一次读取和写入海量数据,可以实现上千台服务器集群并发工作,提供数据处理能力。
3>.MapReduce缺点
不擅长实时计算:
MapReduce无法像MySQL一样,在毫秒级或者秒级返回结果,说到底就是慢。
不擅长流式计算:
流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。
但是需要补充的是,静态数据和动态数据的鸿沟并不是不可跨越的,典型的代码就是Spark,它既能处理静态数据又能处理动态数据。
综上所述,不使用MapReduce处理流式计算的根本原因是慢。如果非要那MapReduce做流式计算的话其速度比Storm还要慢。
不删除DAG(有向图)计算:
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。
在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下,说到底还是慢。
综上所述,MapReduce的缺点就是"慢",但好在它是分布式程序,多个机器一起干同一件事来弥补它的不足。
二.Hadoop MapReduce编程思想
1>.MapReduce进程
一个完整的MapReduce程序在分布式运行时有以下三类实例进程:
MrAppMaster:
负责整个程序的过程调度即状态协调。
MapTask:
负责Map阶段的整个数据过程处理流程。
ReduceTask:
负责Redcue阶段的整个数据处理流程。
2>.MapReduce核心思想
MapReduce模型是对大量分布式处理问题的总结和抽象,它的核心思想是分而治之,即将一个分布式计算过程拆解成两个阶段。
第一个阶段(也称为Map阶段):
由多个可并行执行的MapTask构成,主要功能是将处理数据按照数据量大小切分成等大的数据分片,每一个分片交由一个任务处理。
该阶段的MapTask并发实例,完全并行运行,互不相干。
第二个阶段(也称为Reduce阶段):
由多个可冰箱执行的ReduceTask构成,主要功能是对前一阶段中各任务产生的结果进行规约,得到最终结果。
该阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个的所有MapTask并发实例的输出。
MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序串行运行,后一个MapReduce程序依赖于上一个MapReduce的输出结果(该结果被落地到本地磁盘)。
3>.开发人员需要编写MapReduce的map()和reduce()函数概述
MapReduce的出现,使得用户可以把主要精力放在设计数据处理算法上,至于其它的分布式问题,包括节点的通信,节点失败,数据切分,任务并行化等,全部由MapReduce运行时环境完成,用户无需关心这些细节。 以wordcount为例,用户只需编写map()和reduce()两个函数,即可完成分布式程序的设计,这两个函数作用如下: map()函数: 获取给定文件中一行字符串,对其分词后,依次输出这些单词。 reduce()函数: 将相同的词聚集在一起,统计每个词出现的总频率,并将结果输出。
以上两个函数与"回调函数"类似,MapReduce框架将在合适的时机主动调用它们,并处理与之相关的数据切分,数据读取,任务并行化等复杂问题。
三.MapReduce编程规范
1>.常用的数据类型对应的Hadoop数据序列化类型
Java类型 Hadoop Writable 类型
Boolean BooleanWritable
Byte ByteWritable
Int IntWritable
Float FloatWritable
Long LongWriteable
Double DoubleWritable
String Text
Map MapWritable
Array ArrayWritable
2>.MapReduce编程规范
用户编写的程序分为三个部分,即Mapper,Reducer和Driver。
Mapper阶段:
(1)用户自定义的Mapper要继承自己的父类;
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义);
(3)Mapper中的业务逻辑写在map()方法中;
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义);
(5)map()方法(即MapTask进程)对每一个"<K,V>"调用一次;
Reducce编程规范:
(1)用户自定义Reducer要继承自己的父类;
(2)Reducer的输入数据对应Mapper的输出数据类型,也是KV;
(3)Reducer的业务逻辑在reduce()方法中;
(4)ReduceTask进程对每一组相同K的<K,V>组调用一次reduce()方法;
Driver阶段:
相当于YARN集群的客户端,用于提交我们的MapReducer整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象。
3>.使用Java代码实现一个MapReduce实战案例
博主推荐阅读: https://www.cnblogs.com/yinzhengjie2020/p/12516593.html