一、概述

  MapReduce是一种编程模型,这点很重要,仅仅是一种编程的模型,而不是具体的软件。在hadoop中,HDFS是分布式的文件存储系统,而MapReduce是一个分布式的计算框架。用于大规模数据集(大于1TB)的并行运算。 说白了就是程序运行时将数据操作分为好几部,主要是:拆分->排序->组合的过程。

二、原理和工作流程

  2.1原理

    一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。 整个框架负责任务的调度和监控,以及重新执行已经失败的任务。

    通常,Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。一般将计算节点称为nodemanager。

    Map/Reduce框架由一个单独的master JobTracker 和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。

  2.2流程

    

  

   通过上面的流程图,在这对着个图的每一个程序进行一一的解读:

  JobClient:

    配置参数Configuration,打包成.jar文件存储在HDFS上,然后将文件路径提交给JobTracker的master服务,然后由master创建task将它们分发到各个TaskTracker服务中去执行。

  JobTracker:

    这是一个master服务,程序启动后,JobTracker负责资源监控和作业调度。JobTracker监控所有的TaskTracker和job的健康状况,一旦发生失败,即将之转移到其他节点上,同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop 中,任务调度器是一个可插拔的模块,用户可以根据自己的需要设计相应的调度器。

  TaskTracker:

    运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信接受作业,并负责直接执行每个任务。TaskTracker 会周期性地通过Heartbeat 将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker 使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop 调度器的作用就是将各个TaskTracker 上的空闲slot 分配给Task 使用。slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用。TaskTracker 通过slot 数目(可配置参数)限定Task 的并发度。

  Task分为Map Task和Reduce Task两种,均由TaskTracker启动。HDFS以block块存储数据,mapreduce处理的最小数据单位为split。split如何划分又用户自由设置。

  流程解释:

  第一步:编写好MapReduce程序后打包,运行。

  第二步:程序执行成功。JobClient会根据配置文件信息向JobTracker申请可用的job(这里指的可用job是相应数量的maptask的工作进程)。JobTracker返回一个可用的JobID给JobClient。

  第三步:根据得到的JobID, JobClient会把所需要的资源复制一份到HDFS上,这些资源包括MapReduce程序打包的JAR文件,配置文件和客户端计算所得的输入划分信息。JobTracker专门为该作业创建的文件夹中,文件夹名为该作业的JobID,JAR文件默认

会有10个副本(通过配置参数mapreduce.client.submit.file.replication属性控制);输入划分信息告诉了JobTracker应该为这个作业启动多少个map任务等信息。

  第四步:JobClient提交作业到JobTracker,当JobTracker接收到作业之后,将其放到一个作业队列里面,等待作业调度器对其进行调度, 当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行。对应map和reduce任务,TaskTracker,根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。注意:map任务不是随便的分配给某个TaskTracker,这里有个概念叫数据本地化(Data-Local),指的是将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到改TaskTracker上运行,这叫“运算移动,数据不移动”,而分配reduce任务时不考虑数据本地化。

  第五步:TaskTracker每隔一段时间会给JobTracker发送心跳,告诉JobTracker它依然在运行,同时心跳还携带了很多信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,会把该作业设置为(success),当JobClient查询状态时,它将得知任务完成,便显示一条消息给用户。

  以上就是从JobClient,JobTracker,TaskTracker角度来分析MapReduce的工作原理。以上的工作原理将流程图的步骤进行了整合。

三,MapReduce编程模型

  3.1 原理

  

  

Map端:

    1,mapReduce启动后会先扫描整个提交的文件, 然后回对文件进行切片处理:

      例如:a.txt(200M), b.txt(300M), c.txt(100M),这些文件将会被切成:split00001 0-128M、split00002 128-200M,split00003 0-128M, split00004 128-256M, split00005 256M-300M, split00006 100M

    2,根据切片的数量会启动相应数量的MapTask进行读取,若切片数量很多,而机器启动的MapTask到达了上限,则例如只有两台机器,每台只启动一个Mapask要处理上面的切片,则进行分批的读取,读取的模式是一行一行的读取。每读取一行就可以进行map处理,这个map处理是一个通用的接口,没有被写死,可以为我们自己去实现。而map的过程就是我们进行提取数据的过程,map过程参数的是一组组K:1, K2:1, K3:1数据。

    3,map输出的结果会暂时存在在一个环形内存缓冲区内(该缓冲区的大小默认为100M,由io.sort.mb属性控制)。当缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将改缓冲区中的数据写入文件。

    4,在将缓冲区数据写入磁盘之前,线程会根据reduce任务的数量将数据划分为相同的数据分区,也就是说一个reduce任务对应一个分区数据。当然也有可能出现一个reduce有多个分区的数据,这样做的目的为了避免有些reduce任务分配到大量的数据。而有些

reduce任务却很少数据。其实对数据分区就是一个hash的过程。然后对每个分区中的数据进行排序。如果此时设置了聚合(Combiner),会将排序后的结果进行聚合操作。这样做的目的是减少数据的写入磁盘的次数和数据的量。

    5,当map任务输出最后一个记录后,可能会有溢出文件,这时需要将这些文件合并。合并的过程会不断的进行排序和combiner操作。目的有两个:1,尽量减少每次写入磁盘的数据量; 2,尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且排序的文件。为了减少网络传输的数据量,这里可以将数据进行压缩,只要将只要将mapred.compress.map.out设置为true就可以。

    数据压缩:Gzip、Lzo、snappy。

    6,将分区中的数据拷贝给相对应的reduce任务。有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和obTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就OK了。

  Shuffle:

    上面map参数的K:V数据会统一的提交到shuffle端,进行shuffle处理,在这个过程中,会对相同的K的值排在一起(排序),不同的K分在不同的区域,这样做的目的是为了ReduceTask读取。若这些K数据有很多组,如何将这些不同的K分配到

有限的ReduceTask中呢,这就需要对这些K进行hash,将这些hash取余,相同的就分在一组ReduceTask中。

  Reduce:

    1,Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接受的数据量相当小,则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,表示用作此用途的堆空间的百分比),如果数据量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merge.percent决定),则对数据合并后溢写到磁盘中。

    2,随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。其实不管在map端还是reduce端,MapReduce都是反复地执行排序,合并操作,现在终于明白了有些人为什么会说:排序是hadoop的灵魂。

    3,合并的过程中会产生许多的中间文件(写入磁盘了),但MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。

  3.2 实例流程图

Hadoop生态集群MapReduce详解的更多相关文章

  1. Hadoop生态集群YARN详解

    一,前言 Hadoop 2.0由三个子系统组成,分别是HDFS.YARN和MapReduce,其中,YARN是一个崭新的资源管理系统,而MapReduce则只是运行在YARN上的一个应用,如果把YAR ...

  2. Apache + Tomcat集群配置详解 (1)

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

  3. [转帖]Application Request Route实现IIS Server Farms集群负载详解

    Application Request Route实现IIS Server Farms集群负载详解  https://www.cnblogs.com/knowledgesea/p/5099893.ht ...

  4. Solr系列二:solr-部署详解(solr两种部署模式介绍、独立服务器模式详解、SolrCloud分布式集群模式详解)

    一.solr两种部署模式介绍 Standalone Server 独立服务器模式:适用于数据规模不大的场景 SolrCloud  分布式集群模式:适用于数据规模大,高可靠.高可用.高并发的场景 二.独 ...

  5. MySQL集群搭建详解

    概述 MySQL Cluster 是MySQL 适合于分布式计算环境的高实用.可拓展.高性能.高冗余版本,其研发设计的初衷就是要满足许多行业里的最严酷应用要求,这些应用中经常要求数据库运行的可靠性要达 ...

  6. Hadoop生态集群之HDFS

    一.HDFS是什么 HDFS是hadoop集群中的一个分布式的我文件存储系统.他将多台集群组建成一个集群,进行海量数据的存储.为超大数据集的应用处理带来了很多便利. 和其他的分布式文件存储系统相比他有 ...

  7. Storm集群安装详解

    storm有两种操作模式: 本地模式和远程模式. 本地模式:你可以在你的本地机器上开发测试你的topology, 一切都在你的本地机器上模拟出来; 远端模式:你提交的topology会在一个集群的机器 ...

  8. Centos7 zookeeper单机/集群安装详解和开机自启

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  9. Flume NG高可用集群搭建详解

    .Flume NG简述 Flume NG是一个分布式,高可用,可靠的系统,它能将不同的海量数据收集,移动并存储到一个数据存储系统中.轻量,配置简单,适用于各种日志收集,并支持 Failover和负载均 ...

随机推荐

  1. 解决“Comparison method violates its general contract!”

    The ONE跑MaxProp.Prophet可能(取决于你JDK的版本)会报“java.lang.IllegalArgumentException: Comparison method violat ...

  2. ubuntu install wiznote

    sudo add-apt-repository ppa:wiznote-team #添加官方源 sudo apt-get update #更新源 sudo apt-get install wiznot ...

  3. Python3字典

  4. c++中常用的泛型算法

    std中定义了很好几种顺序容器,它们自身也提供了一些操作,但是还有很多算法,容器本身没有提供. 而在algorithm头文件中,提供了许多算法,适用了大多数顺序容器.与c++11相比,很多函数在 c+ ...

  5. Elasticsearch学习笔记——分词

    1.测试Elasticsearch的分词 Elasticsearch有多种分词器(参考:https://www.jianshu.com/p/d57935ba514b) Set the shape to ...

  6. application.properties配置文件

    SpringBoot可以识别两种格式的配置文件,分别是yml文件与properties文件,可以将application.properties文件换成application.yml applicati ...

  7. 易混HTML Entities与正确用法

    在页面上,表示HTML实体有多种方式,比方有"&+name;"."&#+10进制ID"."&#x+16进制ID".而 ...

  8. 企业SaaS模式的优缺点

    好处: 1.降低成本 项目成本.人员成本 2.使用简单 无需系统维护,用户只需登录就可以享受系统的功能 3.安全性 SaaS模式下,企业用户最关注的是自己的数据能不能得到安全保护. A.涉及的数据有哪 ...

  9. linux执行python命令后permission denied

    linux下执行python后显示被拒绝问题定位: 1.检查下要执行的文件的权限是否存在执行权限,否则执行chmod命令赋予权限: 2.若赋予权限后仍然显示没有权限,检查下执行的python文件是否有 ...

  10. Qt编写视频监控画面分割界面(开源)

    其实qt应用在安防领域还是蛮多的,尤其是视频监控系统,但是网上几乎没有看到qt做的最基础的视频监控画面分割的demo,今天特意花几分钟提取出来,开源放出来.欢迎大家多多点赞!源码下载:点击打开链接 运 ...