MapReduce概述_数据向计算靠拢是什么意思-程序员宅基地

技术标签:   

目录

MapReduce概述 

分布式并行编程

MapReduce模型简介

MapReduce体系结构

MapReduce工作流程 

MapReduce工作特点 

Shuffle过程原理

MapReduce完成的shuffle过程

MapReduce应用程序执行过程

实例分析:WordCount

MapReduce的具体应用


MapReduce概述 

分布式并行编程

    数据处理能力提升的两条路线

        单核CPU到双核到四核到八核

        分布式并行编程:不是把程序在一台单机上运行,借助一个集群通过多台机器同时并行处理大规模数据集

            分布式并行编程是多台计算机同时在运行相关的程序

分布式与集群是什么?区别是什么?

    MapReduce和传统的并行编程框架

 

集群的架构和容错性

硬件价格及扩展性

编程和学习难度

适用场景

传统的并行编程框架

采用共享式架构(共享内存、共享底层的存储空间),例如性能计算模型HPC

1、扩展比较难2、因为硬件之间紧密耦合,所以其中一个硬件发生故障以后容易导致整个集群不可工作

采用刀片服务器,高速网络一集存储区域网络SAN

普通刀片服务器几万,好一点的十几万(成本高)

且只能纵向扩展(增加内存、更多磁盘)

编程难度高

(程序员不仅要解决要做什么,同时还要解决怎么做(必须要通过程序的方式告诉它怎么做))

编程原理和多线程的编程逻辑比较类似,来实现不同任务之间的同步

用于实施的细粒度计算

尤其适用于计算密集型的应用

MapReduce

采用典型的非共享式架构

在整个集群当中,每个节点都拥有自己的内存(节点之间非共享),任何一个节点出现问题,不会影响其他节点正常运行,整个集群中又设计了冗余和容错机制

整个集群可以随意增加减少相关的计算节点,这个个人计算机就可以(成本低、扩展性好)

MapReduce只需要告诉系统你要做什么事情,而不需要开发人员去告诉它如何去做。它会屏蔽掉整个分布式程序运行底层的所有细节(包括同步以及不同进程之间的通信、负载均衡、失败的恢复等)整个都不需要开发人员去做,整个系统框架自动帮你实现

MapReduce会自动实现分布式部署,部署到集群上面的各个机器上面去运行

一般适用于非实时的批处理以及数据密集型的应用

 

MapReduce模型简介

    MapReduce整个框架的核心设计就是两个函数:Map和Reduce

    MapReduce的策略:采用分而治之

        当采用MapReduce去做大规模数据处理的时候

            MapReduce会把非常庞大的数据集,切分成非常多的独立的小分片(spilt)

                 然后为每一个分片单独的启动一个map任务

                      最终通过多个map任务,并行地在多个机器上去处理

 

MapReduce的理念:计算向数据靠拢而不是数据向计算靠拢

    数据向计算靠拢是指:完成一次数据分析时,选择一个计算节点,把运行数据分析的程序放到计算节点上运行

        然后把它涉及到的数据,全部从各个不同节点上面拉过来,传输到计算发生的地方

但是在大数据时代,把所有的数据拉到一个计算节点上去计算,基本上是不可能的(计算机处理起来会崩溃)

    计算向数据靠拢是指:在做应用程序计算的时候,构建一个集群,在集群中选择相关的机器作为map机器,这些map机器负责相关的数据处理分析,还有一些是Reduce机器,做Reduce任务处理。

        拿这些机器去做数据处理,假如说要去处理某一很大的数据集(数据集被分布的存储到各个节点上面(HDFS是以块为单位           存储数据),这些数据块都是存储到不同的机器节点上面去),假设某一个数据块存储在机器A上面,对于MapReduce来             说,如果想对数据块A进行分析的话,但是它又不存在机器A上面,这时,MapReduce会去寻找离机器A最近的map机器去完         成对数据块的处理。通常来讲比较理想情况下,map任务就是和数据块在同一个机器上面,这就是实现了计算向数据靠拢,         数据不需要发生迁移,计算就可以在数据节点上面执行,完成运算得到结果,最终把结果汇总到相关的任务协调节点,提交         给用户。

       通过这种方式:大大减少了整个网络当中的数据传输开销,从而提升了整个分布式程序处理性能。

 

MapReduce的架构:采用了master/slave的架构

Master/slave架构中包括:一个master服务器以及若干个slave服务器(Master就是名称节点,Slave就是数据节点)

    Master上面会运行作业跟踪器(JobTracker)

        JobTracker负责整个作业的调度和处理以及失败和恢复

slave上面会运行负责具体任务执行的组件(TaskTracker)

        TaskTracker负责接收JobTracker给它发的作业处理指令,完成具体的任务处理

 

 

 

 

MapReduce体系结构

这个图有点小错误就是Task Schedule是任务分配器,当时写的时候理解的不是很好

Client(客户端)

通过Client可以提交用户编写的应用程序,用户通过它将应用程序交到JobTracker端

通过这些Client,用户也可以通过它提供的一些接口去查看当前作业的运行状态

通常在Hadoop中,通常来讲应用程序到了集群当中都是表现为作业的形式

JobTracker(作业跟踪器(管家))

负责资源的监控和作业的调度

监控底层的其他的TaskTracker以及当前运行的Job的健康状况

一旦探测到失败的情况就把这个任务转移到其他节点继续执行跟踪任务执行进度和资源使用量,并会把这些信息发送给任务调度器Task Schedule

Task Schedule

负责任务调度(解决应该把哪个Task(任务)分发给哪个TaskTracker去执行(各个TaskTracker是分布在不同的机器上面,负责执行具体任务))

它会从具有空闲资源的节点中选出相关节点,然后把Task分配到这些节点上去执行

Task Schedule是一个可插拔模块,允许用户自己去编写调度模块,采用自己的任务调度策略去实现

TaskTracker

TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)

TaskTracker是以一种什么方式衡量资源使用情况?

TaskTracker使用一个槽的概念,叫slot。它会把机器上面所有的CPU内存资源进行打包,然后把资源进行等分,等分成很多slot。slot是一个资源调度单位。一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用。两种类型slot是不通用的。如果有10个slot,那么5个给map、5个给reduce,如果reduce任务是空闲的,一个槽都没用,map的槽已经被map任务占满了,而且还有一个map任务等待执行,但reduce槽也不会分给排队的map任务,该缺陷Hadoop2.0中做出了修改。

 所以是以slot为单位调度资源,所以是只有这个机器上有空闲的slot,才能把相关的Task分配给他执行,如果有空闲的map slot,就把map Task分配给他执行。如果有空闲的reduce slot,就把reduce Task分配给他去执行

Task(任务)

Task包括map任务(专门执行map函数)和reduce任务(专门执行reduce函数)

这两个任务都是由TaskTracker来启动的

在同一台机器上面是可以同时运行map Task和reduce Task这两种任务的

  

  Map任务的数量,即谁来完成任务分配和数据分片,名称节点还是数据节点?

  名称节点。

    HDFS以固定大小的block为基本单位存取数据,而对于MapReduce而言,其处理单位是Split。Split 是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等,它的划分方法完全由用户自己决定。 但大多数情况下,理想的分片大小是一个HDFS块。(下图的分片是有问题的,split1和split4的数据分片涵盖了两个数据节点,Map任务执行时需要移动数据。)

 

MapReduce工作流程 

 

 

 分片:

InputFormat会把一个大的文件分成很多split,那split如何分呢?

一个文件被这样切分成了4片(逻辑分片),但其实它有六个块(物理块)组成,这个文件在底层是分布式存储在不同的机器上面,一共存储了六个块,但每个块都有冗余存储。

分片和块是不同的概念

当每一次产生一个分片的时候,Hadoop都会给这个分片生成一个map任务。所以,整个集群里面,分了多少个分片,就会产生多少个map任务。

如果分片过多,导致map任务启动过多,map任务之间需要进行相关的切换的时候,要耗费相关的管理资源,影响执行效率。

如果分片过少,又会影响程序的并行度,达不到提升整个程序处理效率的目的。

现在,实际应用中,会把一个块的大小作为分片的大小。例如:上图,第一个分片时候占了block1和block2,那map机器在block1上面,如果需要block2的值,还需要把block2的数据传输到block1,这就造成了额外的数据传输开销

 

map任务数量和reduce任务数量是如何确定的?

在Hadoop集群当中,执行MapReduce任务的时候,map任务数量就是由产生分片的数量来决定的(因为产生一个分片就需要启动一个map任务)。

reduce任务数量:在极端情况下,如果不考虑任何并行度,就可以只启动一个reduce任务。但通常来讲reduce任务都是在多个机器上,有多个任务同时运行,这样可以增加并行度。

reduce任务如何设置?

最优的reduce任务个数取决于集群中可用的reduce任务槽(slot)的数目。

通常设置比reduce任务槽数目稍微小一些的reduce任务个数(这样可以预留一些系统资源处理可能发生的错误)

 

    一个数据节点上可能有某个文件的多个数据块。

    多个数据块可以分成多个数据分片,一个数据块也可以分成多个数据分片。

    一个数据分片分配给一个Map任务进行处理。

    一个数据节点上可以运行多个Map任务。

    

    一个数据节点上能否运行多个Reduce任务?

    可以,但是一般不会这么分配

 

MapReduce工作特点 

不同的Map任务之间不会进行通信,不同的Reduce任务之间也不会发生任何信息交换。用户不能显式地从一台机器向另一台机器发送消息,所有的数据交换都是通过MapReduce框架自身去实现的。Map任务的输入文件、Reduce任务的处理结果都是保存在分布式文件系统中的,而Map任务处理得到的中间结果则保存在本地存储中。只有当Map处理全部结束后,Reduce过程才能开始。只有Map需要考虑数据局部性,实现“计算向数据靠拢”,Reduce则无需考虑数据局部性

一个Map任务,能不能处理多个不同的<k1,v1>键值对?

     一个Map任务是可以处理多个不同的<k1,v1>值的,并且对于每一个输入的<k1,v1>都会输出一批<k2,v2>

    

Shuffle过程原理

 

 

 

 

map任务和reduce任务可以在同一台机器上,也可以在不同的机器上。

我们先假设在不同的机器上面。

现在看起来是只有一个map任务和一个reduce任务,但实际上在集群当中有非常多个map任务以及非常多reduce任务,且很多map任务和reduce任务同时执行。

 现在只是放大了一个map任务和一个reduce任务。

数据是保存在分布式文件系统HDFS中,所以,输入,从文件式分布系统当中输入数据,输入完以后进行相关的分片处理,一个分片对应一个map任务,交给map函数,Map里面包含了用户对数据的处理逻辑,所以这个Map任务会运行用户处理逻辑以后,输出处理结果,那这个处理结果是一堆的键值对,这些键值对并不直接发送给reduce任务。

会先写到缓存当中,当缓存满的时候发生溢写,把缓存中的数据写到磁盘里面生成磁盘文件,同时把缓存清空掉,当把缓存当中的数据溢写到磁盘中的时候,会经历分区、排序、可能发生的合并以及文件的归并。

溢写发生多次,会生成多个磁盘文件,对于每一个磁盘文件,会进行统一的归并,多个磁盘文件归并为一个大的文件,归并完以后这个磁盘文件当中就包含了所有的键值对(都是经过分区、排序的),最终会得到一个大文件,它会通知相关Reduce任务把它取走。

 

 

为什么要分区?Map输出一些键值对,最终是扔给多个不同的reduce任务去处理,所以一定要分区。如果有4个reduce任务,就会分成四个分区,每个分区都由对应的reduce任务把它取走。

分区后进行排序(默认操作),把键值对根据key的字典序进行排序,排完序之后,每个分区里面的数据都是有序的。

可能发生的操作:合并(Combine)和Merge不是一个概念,要区分开。合并是为了减少溢写到磁盘当中的数据量。由两个键值对合并完之后变为一个键值对,由此,可以减少很多键值对,这样写入的数据量就会大大减少

之后写入磁盘,生成一个磁盘文件。

80MB缓存一满就把80MB写入磁盘,生成一个80MB的磁盘文件,溢写一次生成一个磁盘文件

随着溢写的多次发生,最终在磁盘上会有多个溢写文件,这多个溢写文件,最终在整个Map任务运行结束之前,系统会进行归并,放入本地磁盘。这大的文件里面的键值对都是分区的而且是排序的。

JobTracker会跟踪Map任务,JobTracker一旦检测到Map任务写完数据,JobTracker就会通知相应的Reduce任务,把这些属于该Reduce任务处理的分区数据让Reduce拉走。

 

 

 

 MapReduce完成的shuffle过程

  

 

 

MapReduce应用程序执行过程

第一步,进行程序部署,把程序分配到不同的机器上面去,要从整个集群当中选出相关的机器,有些机器作为Master(只有一个),其他机器作为Worker。

Master机器作为一个管家的角色(上面运行JobTracker),其他机器作为Worker,Worker可以执行Map任务,也可以执行Reduce任务(在一堆的Worker中,选出一部分做Map

任务,另外一部分Worker做reduce任务)。要把执行的用户逻辑,分发到这些机器上去。这就是第一步完成了程序的部署。

第二步,集群中已经有这么多的Worker,接下来选出一部分Worker,把它作为执行map任务的机器,另一部分Worker作为执行reduce任务的机器,然后对于执行map任务的机器,因为运行map任务,所以需要输入数据,输入数据一般都会非常大的文件,所以需要对文件进行拆分,要对一个大的数据集进行分片,分成多个片段,分完片段以后,需要从集群中执行map任务的机器里面,选出几个空闲的机器,让它们执行数据分片的处理。

第三步,从分布式文件系统各个分片中把数据读入,读入以后生成相关的(key,value)键值对,然后提交给map任务去执行,Map里面包含了用户编写的应用程序处理逻辑,然后会输出一堆相关的(key,value),输出结果不是直接写入磁盘,也不是直接发送给reduce任务,而是先写到缓存。

第四步,一旦缓存里的写满以后,就要溢写到磁盘,所有要把缓存当中的数据,经过分区排序或者可能发生的合并操作,再把它写到磁盘当中去,写到磁盘以后就生成一个大的文件,这个文件当中包含的是很多个分区的数据,然后这个分区里的数据,都是排序的合并以后的数据,这些数据要发送给远端的reduce任务去处理。

第五步,负责执行相关reduce任务的机器,会从各个相关的map任务机器,把属于自己处理的数据都拉回去,拉回到本地进行相关的处理,处理完以后执行用户自定义的reduce函数,完成数据处理,处理结果就是一堆的键值对。

第六步,把相关的结果写到输出文件当中去,这个输出文件会写入分布式文件系统HDFS。

这是MapReduce应用程序基本执行过程,包含五大阶段,输入文件、map阶段、中间文件阶段、reduce阶段和输出文件阶段。

中间过程数据是不写入到HDFS中的,而是写入磁盘中,map任务在那个机器上边,中间结果就写到那个机器磁盘上面

 

实例分析:WordCount

 

 

只有特定的任务,能满足分而治之的任务,才可以使用MapReduce去解决。

可以把一个大的块切分成很多小的块,这些小的块分别放在不同机器上并行执行,大家互相并行执行,彼此结果不会依赖对方的结果,这个是可以满足分而治之的策略的数据集。

如果说数据集之间的结果互相依赖,它的结果依赖另一个结果,那就不可以,那就不能用MapReduce去做。

 

MapReduce的具体应用

  具体应用:自然连接

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43717681/article/details/108889991

智能推荐

蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞_蓝凌eis智慧协同平台文件上传漏洞-程序员宅基地

文章浏览阅读979次。蓝凌智慧协同平台eis集合了非常丰富的模块,满足组织企业在知识、协同、项目管理系统建设等需求。_蓝凌eis智慧协同平台文件上传漏洞

LLaVA-1.5-程序员宅基地

文章浏览阅读193次。与InstructBLIP或Qwen-VL在数亿甚至数十几亿的图像文本配对数据上训练的、专门设计的视觉重新采样器相比,LLaVA用的是最简单的LMM架构设计,只需要在600K个图像-文本对上,训练一个简单的完全连接映射层即可。结果表明,LLaVA-1.5不仅可以使用更少的预训练和指令微调数据,而且还可以利用最简单的架构、学术计算和公共数据集来实现最佳的性能——在12个基准中的11个上取得了SOTA。为了解决这个问题,研究人员建议在VQA问题的末尾,添加一个可以明确输出格式的提示,进而让模型生成简短回答。

ORACLE基本数据类型总结_oracle 数值类型最大值-程序员宅基地

文章浏览阅读442次。2013-08-17 21:04 by 潇湘隐者, 100246 阅读, 5 评论, 收藏, 编辑 ORACLE基本数据类型(亦叫内置数据类型 built-in datatypes)可以按类型分为:字符串类型、数字类型、日期类型、LOB类型、LONG RAW& RAW类型、ROWID & UROWID类型。在讲叙字符串类型前,先要讲一下编码。字符串类型的数据可依编码方式分成_oracle 数值类型最大值

10种机器学习算法_决策树和mlp-程序员宅基地

文章浏览阅读315次。作为数据科学家的实践者,我们必须了解一些通用机器学习的基础知识算法,这将帮助我们解决所遇到的新领域问题。本文对通用机器学习算法进行了简要的阐述,并列举了它们的相关资源,从而帮助你能够快速掌握其中的奥妙。▌1.主成分分析(PCA)/ SVDPCA是一种无监督的方法,用于对由向量组成的数据集的全局属性进行理解。本文分析了数据点的协方差矩阵,以了解哪些维度(大部分情况)/数据点(少数情况)更为重要,即它..._决策树和mlp

桥接模式的实现-程序员宅基地

文章浏览阅读148次。在这个示例中,我们使用std::shared_ptr来管理Implementor对象的生命周期,确保在不再需要时自动释放资源。通过智能指针的使用,我们避免了手动管理内存的复杂性,提高了代码的可靠性和可维护性。希望这个示例能帮助你理解如何使用智能指针来实现桥接模式。当使用智能指针来实现桥接模式时,我们可以利用std::shared_ptr或std::unique_ptr来管理对象的生命周期,确保资源的正确释放。

制造业敏感文件外发不安全?一招解锁更高效的加密方式!-程序员宅基地

文章浏览阅读440次,点赞11次,收藏8次。云盒子在制造业上有丰富的部署经验,在面向制造类企业的重要文件,可以通过审计、授权、文件加密进行多重保护,使得图纸文件、专利技术、采购订单等敏感数据等到有效保护,做到无处可泄,同时安全可靠,也不会对日常工作效率有影响 ,实现真正有效的企业文件保护的目的,达到既防止机密文件外泄和扩散,又支持内部知识积累和文件共享的目的。云盒子的加密方式是通过将本地文件数据上传到云盘进行统一加密存储,而不是对设备加密,通过【本地加密】+【云加密】双重组合下,不管用什么设备打开文件都受到管控,使管理者管理起来能够更高效。

随便推点

计算几何讲义——计算几何中的欧拉定理-程序员宅基地

文章浏览阅读188次。在处理计算几何的问题中,有时候我们会将其看成图论中的graph图,结合我们在图论中学习过的欧拉定理,我们可以通过图形的节点数(v)和边数(e)得到不是那么好求的面数f。 平面图中的欧拉定理: 定理:设G为任意的连通的平面图,则v-e+f=2,v是G的顶点数,e是G的边数,f是G的面数。证明:其实有点类似几何学中的欧拉公式的证明方法,这里采用归纳证明的方法。对m..._怎么证明平面图欧拉定理

c语言中各种括号的作用,C语言中各种类型指针的特性与用法介绍-程序员宅基地

文章浏览阅读750次。C语言中各种类型指针的特性与用法介绍本文主要介绍了C语言中各种类型指针的特性与用法,有需要的朋友可以参考一下!想了解更多相关信息请持续关注我们应届毕业生考试网!指针为什么要区分类型:在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境 下,任何一个指针变量都只占用8个字节,并不会随所指向变量的类型而改变。虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数..._c语言带括号指针

缅甸文字库 缅甸语字库 缅甸字库算法_0x103c-程序员宅基地

文章浏览阅读9.5k次。字库交流 QQ:2229691219 缅甸语比较特殊、缅甸语有官方和民间之分,二者不同的是编码机制不同,因此这2种缅甸语的字串翻译、处理引擎、字库都是不同的。我们这里只讨论官方语言。 缅文、泰文等婆罗米系文字大多是元音附标文字,一般辅音字母自带默认元音可以发音,真正拼写词句时元音像标点符号一样附标在辅音上下左右的相应位置。由于每个元音位于辅音的具体位置是有自己的规则的,当只书写..._0x103c

Python+django+vue校园二手闲置物品拍卖系统pycharm毕业设计项目推荐_基于python+django+vue实现的校园二手交易平台-程序员宅基地

文章浏览阅读200次。在校园,随着学生数量的增多,存在许多生活和学习物品,许多学习用品经过一学期学习之后往往被闲置,一些出于一时喜欢而购买的物品使用机会少而被闲置,还有一些物品以低廉的价格卖给资源回收站,造成巨大的资源浪费。校园闲置物品拍卖系统使用python技术,MySQL数据库进行开发,系统后台使用django框架进行开发,具有低耦合、高内聚的特点,其中校园用户通过人脸识别的方法增加系统安全性,在闲置物品推荐中,使用协同过滤算法进行商品推荐。系统的开发,帮助高校有效的对闲置物品进行管理,提高了闲置物品销售的效率。_基于python+django+vue实现的校园二手交易平台

【推荐系统论文精读系列】(十)--Wide&Deep Learning for Recommender Systems_引用《wide & deep learning for recommender systems》-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏3次。文章目录Wide & Deep Learning for Recommender Systems一、摘要二、介绍三、推荐系统综述四、Wide&Deep学习4.1 Wide部分4.2 Deep部分4.3 联合训练 Wide&Deep ModelPreferenceWide & Deep Learning for Recommender Systems一、摘要具有非线性特征转化能力的广义线性模型被广泛用于大规模的分类和回归问题,对于那些输入数据是极度稀疏的情况下。通过使用交_引用《wide & deep learning for recommender systems》

c++ sleep函数_Linux 多线程应用中如何编写安全的信号处理函数-程序员宅基地

文章浏览阅读171次。关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略。本文首先介绍如何编写安全的异步信号处理函数;然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同步的方式处理。Linux 多线程应用中编写安全的信号处理函数在开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量。如果应用中使用了信号,而且信号的产生不..._linux c++ sleep 不被中断

推荐文章

热门文章

相关标签