全方位揭秘!大数据从0到1的完美落地之MapReduce入门

MapReduce是一种分布式计算框架,源于Google的论文,主要用于大规模数据集的并行运算。它简化了开发人员在HDFS上进行分布式计算的复杂性,通过“Map”和“Reduce”两个阶段处理数据,实现了计算向数据的靠拢,提高了效率并具有良好的扩展性和高容错性。Map阶段处理原始数据,Reduce阶段进行数据聚合。MapReduce适用于离线处理PB级别数据,但不适合实时或流式计算。
摘要由CSDN通过智能技术生成

cb8065380cd79123adbc76c018a3fd85b3b78041

MapReduce入门

​ 我们已经学习过了HDFS,大体量的数据存储于HDFS上。而HDFS是一个分布式的文件系统,存储于HDFS的文件将被分为不同的数据块。那么我们怎么对HDFS的数据进行计算呢?我们以Hadoop中非常经典的WordCount案例为例。所谓的WordCount,指的是统计指定的文件中的每一个单词出现的次数。

​ 如果我们要统计的文件在一个机器上,我们可以使用Java程序快速的实现这个效果,但是现在我们要处理的数据需要分布在多台机器上。那么,这个问题处理起来就非常复杂了,因为这是一个很典型的分布式的应用程序。

​ 我们可以将所有的数据块都移动到一个节点上,然后在同一个节点进行单词的统计。而这就是非常典型的移动数据,这个效率是非常低下的!我们要处理的数据量一般都比较大,那么在节点之间进行拷贝的时候就会消耗大量的时间,而且还有可能出现一台设备存储不了这样的数据的情况。况且,此时集群中的其他的节点的计算资源都是闲置的,浪费资源。因此,这种解决方案行不通!

​ 那我们换一个思路,我们将统计一个节点的单词数量的程序分发给每一个数据节点,然后在不同的节点上进行单词的词频统计。计算程序一般体积都非常的小,我们可以快速的实现计算程序在不同的节点之间进行分发,同时也可以利用到每一个节点的计算资源,充分的利用了集群。但是,在这个过程中我们需要处理的问题是:

  1. 如何将计算程序分发给不同的节点
  2. 如何为每一个计算任务分配资源
  3. 如何将每一个节点的计算结果汇总在一起
  4. 如何进行计算过程中的监控
  5. 如果某一个节点出故障了,如何将计算程序再分发到其他的节点继续计算

​ 而这些问题正是分布式计算所需要考虑的问题。怎么解决呢? MapReduce就来了!

​ MapReduce是一个分布式计算框架,使得开发人员在不了解分布式计算的细节的情况下,对分布式文件系统的数据进行计算。开发人员不需要关注上述的分布式计算的细节,把重心放在计算逻辑上即可。大大的简化了分布式计算给开发人员带来的压力!

MapReduce是什么

​ 2004年,谷歌发表了一篇名为《MapReduce》的论文,主要介绍了如何在分布式的存储系统上对数据进行高效率的计算。2005年,Nutch团队使用Java语言实现了这个技术,并命名为MapReduce。时至今日,MapReduce是Apache Hadoop的核心模块之一,是运行在HDFS上的分布式运算程序的编程框架,用于大规模数据集(大于1TB)的并行运算。其中的概念,"Map(映射)“和"Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。

《阅读资料》

  • 在过去的很长一段时间里,CPU的性能都会遵循”摩尔定律“,在性能上每隔18个月左右就是提高一倍。那个时候,不需要对程序做任何改变,仅仅通过使用更优秀的CPU,就可以进行性能提升。但是现在,在CPU性能提升的道路上,人类已经到达了制作工艺的瓶颈,因此,我们不能再把希望寄托在性能更高的CPU身上了。
  • 现在这个时候,大规模数据存储在分布式文件系统上,人们也开始采用分布式并行编程来提高程序的性能。分布式程序运行在大规模计算机集群上,集群是大量的廉价服务器,可以并行执行大规模数据处理任务,这样就获得了海量的计算能力
  • 分布式并行编程比传统的程序有明显的区别,它运行在大量计算机构成的集群上,可以充分利用集群的并行处理能力;同时,通过向集群中增加新的计算节点,就可以很容易的实现集群计算能力的扩展。

为什么要学习MapReduce

​ MapReduce主要解决的是分布式文件存储系统上,数据的分布式计算的问题。在上述导读部分我们介绍过一个WordCount的案例,就是一个非常典型的分布式计算的案例。如果我们将所有的需要处理的数据移动到一个节点上进行处理,那么只是在数据传输的过程中就得消耗大量的时间,而且还可能在一台节点存不下这大量的数据。就算是能够存储下,也能够接受数据移动所带来的时间消耗,集群中其他节点的计算资源也都是在闲置的,不能高效率的利用集群。

​ 因此我们就需要进行分布式的计算,将计算程序分发给不同的节点。在每一个节点上处理自己节点的数据,最后将每一个节点的数据处理结果汇总在一起。而在分布式计算的过程中会遇到很多的分布式计算的细节问题,这些问题都是需要开发人员去考虑的。那么如何去解决这些问题呢?

​ MapReduce是一个开源的、分布式的计算框架,封装了分布式计算程序的实现细节,使得开发人员不需要了解分布式计算底层实现的情况下,就可以去开发一个分布式的计算程序。开发人员只需要将重心放在业务逻辑的实现即可,不需要关注分布式开发的底层细节。因此,对于开发人员来说,可以简化不少的工作量,提交程序开发的效率!

MapReduce的优缺点

优点
  • 易于编程

    它简单的实现一些接口,就可以完成一个分布式程序,这个程序可以分布到大量的廉价的pc机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特性使的MapReduce编程变得非常流行。

  • 良好的扩展性

    当你的计算资源得不到满足的时候,你可以简单的通过增加机器来扩展它的计算能力

  • 高容错性

    MapReduce的设计初衷就是使程序能够部署在廉价的pc机器上,这就要求它具有很高的容错性。比如一个机器挂了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由hadoop内部完成的。

  • 适合PB级以上海量数据的离线处理

缺点
  • 不适合做实时计算

    MapReduce无法做到像Mysql那样做到毫秒或者秒级的返回结果

  • 不适合做流式计算

    流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能流态变化。这是MR自身的设计特点决定了数据源必须是静态的。

  • 不适合DAG(有向图)计算

    多个应用程序存在依赖关系,后一个应用程序的输入为前一个应用程序的输出,在这种情况下,MapReduce并不是不能做,而是使用后每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常低下。

MapReduce的核心思想

  1. MapReduce设计的一个理念是“计算向数据靠拢”(移动计算),而不是“数据向计算靠拢”(移动数据)

  2. 将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,移动到有数据存储的集群节点上,一是可以减少节点间的数据移动开销。二是在存储节点上可以并行计算,大大提高计算效率问题。

    因为移动数据需要大量的网络传输开销,尤其是在大规模数据环境下,这种开销尤为惊人,所以移动计算要比移动数据更加经济。

  3. MapReduce一个完整的运算分为Map和Reduce两个部分。Map会处理本节点的原始数据,产生的数据会临时存储到本地磁盘。Reduce会跨节点fetch属于自己的数据,并进行处理,产生的数据会存储到HDFS上。

《阅读资料》

Hadoop的MapReduce核心技术起源于谷歌在2004年发表的关于MapReduce系统的论文介绍。论文中有这么一句话:Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages。这句话提到了MapReduce思想来源,大致意思是,MapReduce的灵感来源于函数式语言(比如Lisp)中的内置函数map(映射)和reduce(规约)。

简单来说,在函数式语言里,map表示对一个列表(List)中的每个元素做计算,reduce表示对一个列表中的每个元素做迭代计算。它们具体的计算是通过传入的函数来实现的,map和reduce提供的是计算的框架。我们想一下,reduce既然能做迭代计算,那就表示列表中的元素是相关的(比如我想对列表中的所有元素做相加求和,那么列表中至少都应该是数值吧)。而map是对列表中每个元素做单独处理的,这表示列表中可以是杂乱无章的数据。这样看来,就有点联系了。在MapReduce里,Map处理的是原始数据,自然是杂乱无章的,每条数据之间互相没有关系;到了Reduce阶段,数据是以key后面跟着若干个value来组织的,这些value有相关性,至少它们都在一个key下面,于是就符合函数式语言里map和reduce的基本思想了。

mapreduce01

MapReduce的阶段分类

MapReduce的程序在运行的过程中,一般分为两个阶段: Map阶段和Reduce阶段

第一阶段: Map

​ 第一阶段,也称之为Map阶段。这个阶段会有若干个MapTask实例,完全并行运行,互不相干。每个MapTask会读取分析一个InputSplit(输入分片,简称分片)对应的原始数据。计算的结果数据会临时保存到所在节点的本地磁盘里。

​ 该阶段的编程模型中会有一个map函数需要开发人员重写,map函数的输入是一个<key,value>对,map函数的输出也是一个<key,value>对,key和value的类型需要开发人员指定。参考下图:

image-20220127205714156

第二阶段: Reduce

​ 第二阶段,也称为Reduce阶段。这个阶段会有若干个ReduceTask实例并发运行,互不相干。但是他们的数据依赖于上一个阶段的所有maptask并发实例的输出。一个ReudceTask会从多个MapTask运行节点上fetch自己要处理的分区数据。经过处理后,输出到HDFS上。

​ 该阶段的编程模型中有一个reduce函数需要开发人员重写,reduce函数的输入也是一个<key,value>对,reduce函数的输出也是一个<key,value>对。这里要强调的是,reduce的输入其实就是map的输出,只不过map的输出经过shuffle技术后变成了<key,List<Value>>而已。参考下图:

image-20220127210246153

注意: MapReduce编程模型只能包含一个map阶段和一个reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。

**通俗的说明:**分别记录车辆的个数,这个就是Map(每个人负责一个部分的车辆个数),再将每个人记录的车辆个数提交给分配任务的人,此时会汇总得到数据Reduce,其实这就是MapReduce(相同的key为一组进行一次reduce计算【原语】)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值