美文网首页
第7章 MapReduce

第7章 MapReduce

作者: 迪丽娜扎 | 来源:发表于2020-01-28 21:28 被阅读0次

    7.1 概述

    7.1.1 分布式并行编程

    目前遇到的问题:1)摩尔定律开始失效,单个CPU的性能提升速度放缓;2)但需要处理的数据迅速增加
    两种解决的途径:1)CPU由单核变为多核,2)分布式并行编程
    MR之前:已有MPI等成熟的并行计算框架,但MPI有以下缺点:① 使用共享式集群,容错性差、② 硬件价格高且扩展性差、③ 学习难度大。相对来说MR在上述问题上进行了改进。但是,在适用场景上,MPI可以用于实时、细颗粒度、计算密集型场景,而MR适用于离线非实时批处理。

    7.1.2 MapReduce模型简介

    1)把过程高度抽象为Map和Reduce两个函数
    2)从而降低了学习难度,变成很容易
    3)分而治之的策略:把数据分片,由多个Map任务并行处理
    4)计算向数据靠拢的设计理念:数据分布存储到多台机器上,map任务被发送到数据所在机器或尽可能临近的机器,避免了数据传输的开销。
    5)Master/Slave架构
    6)支持多种语言

    7.1.3 Map和Reduce

    Map:1)把小数据集进一步解析成一批k-v对,并输入到Map函数;2)每一个输入的k1-v1对经过Map函数处理后,输出一批新的k2-v2对,k2-v2对是中间结果。
    Reduce:把中间值根据键值(k2)进行聚合输出。
    具体的Map处理过程和聚合过程,则由用户编程完成

    7.2 MapReduce的体系结构

    主要由以下四个部分构成。
    1)Client
    用户编写的程序通过Client提交到JobTracker端
    用户可以通过Client提供的API查看作业运行状态
    2)Job Tracker
    负责资源监控和作业调度
    监控所有的TaskTracker和Job的健康状况
    跟踪任务进度、资源使用情况等,并告知TaskScheduler,由后者进行合适的资源调度
    3)TaskTracker
    将本节点任务进度、资源使用情况等发给JobTracker,并接受后者命令进行启动新任务、杀死任务等操作。
    4)Task
    分为Map Task和Reduce Task两种,均由TaskTracker启动

    7.3 MapReduce工作流程

    7.1 概述

    大致流程是:原始数据分片 → 每个分片启动一个Map任务,进行并行处理 → shuffle:对Map的输出进行分区、排序、归并等 → 发送给Reduce任务进行处理 → 输出并进行分布式存储
    有以下特点
    1)不同的Map任务间不会通信
    2)不同的Reduce间也不会有通信
    3)用户不能显式地操作不同机器间地消息发送,一切都由MapReduce框架自身实现

    7.3.2 MapReduce各个执行阶段

    1. 基本过程
    1)预处理:由InputFormat模块完成数据的格式验证,文件的逻辑切分(切分为多个InputSplit)等工作。
    2)数据加载和转换:由RecordReader模块根据InputSplit信息加载数据,并转换成适合Map任务读取的键值对,然后输入给Map任务。
    3)Map任务:把输入的kv对转换成另一堆kv对,具体的转换规则由用户编程完成。
    4)Shuffle:对Map任务的输出进行分区、排序、合并、归并等操作,然后发送给Reduce任务
    5)Reduce:把接收的kv对根据k进行聚合,具体聚合方式由用户编写的Reduce任务完成
    6)输出、保存:由OutputFormat模块验证结果,并把结果保存到分布式文件系统
    2. 重点概念
    1)分片(Split):在HDFS中,一个文件并分为很多个物理分块(block)。对于MapReduce而言,其处理单位是Split,是一个逻辑概念,只包含一些元数据信息,如数据起始位置、数据长度、数据所在节点等。每个分片对应一个Map任务,设置多少分片就会有多少个Map任务,太多耗费管理资源,太少则降低并行度,通常会把分片大小设置成一个HDFS块的大小
    2)任务数量:Map任务数量上文已描述。Reduce任务数量取决于集群可用的Reduce任务槽(slot)的数目,通常设置成略小于可用数的数

    7.3.3 Shuffle过程 ☆

    1. Map端的shuffle过程
    1)输入数据和执行Map任务:每一个Map接受一个分片,并进行处理。
    2)写入缓存:MapReduce默认100MB的缓存,Map任务的输出先往缓存里进行存储。
    3)溢写
    当缓存用到一定比例(常见0.8,即已用了80MB空间)时,启动溢写操作,把数据写入磁盘。但是溢写并不是直接写到磁盘里,而是首先进行了分区、排序、合并等操作。
    分区:因为每个Map的输出都会分发到多个Reduce任务上,所以先对这些kv对们进行分区。最常用的分区方式是对key进行哈希后再用Reduce任务数取模
    排序:每个分区的数据根据key值进行排序,是MR的默认操作。
    合并(可选操作):如果有两个<"a",1>键值对,可以合并成<"a",2>,相当于把值相加,这是用户自己定义的合并方式。合并是为了减少写入磁盘的数据量,但必须保证不影响后续的Reduce结果。
    完成上述操作后,缓存的数据被写入磁盘
    4)文件归并:Map任务全部完成后,进行归并操作。若存在两个<"a",1>键值对,则把它归并成<"a",<1,1>>,(注意合并与归并的区别,归并就是把值合成一个列表)。归并操作也不一定执行,只有在溢写文件数量大于预设值时才会执行。
    上述操作全部完成后,Map端的shuffle就完事了。
    2. Reduce端的shuffle过程
    1)Reduce任务通过RPC向JobTracker询问任务是否已完成,若完成则领取数据
    2)归并、合并、排序 :Reduce任务从不同的Map任务领取了多份数据,放入缓存,先归并,再合并(可选),然后写入磁盘
    3)多个溢写文件归并成一个大文件
    4)发送给Reduce处理

    7.3.4 MapReduce应用程序的执行过程

    笼统描述为 输入文件 → Map阶段 → 中间文件 → Reduce阶段 → 输出文件。其中Map和Reduce任务是由用户编写,中间的shuffle是自动完成的。其它略。

    7.4 WordCount示例

    WordCount示例之于分布式编程,就像Hello World之于编程。

    7.4.1 任务分析

    不是所有任务都能用MR去做,只有能执行分而治之的策略的任务才可以。

    7.4.2 程序设计

    1)原始数据处理:把原始数据分片,把每片中的内容按行拆分成键值对,以行号作为键,以行内容作为值。这样就可以作为Map的输入了。
    2)Map任务:举例来说,输入是<1, "hello world bye world">,输出是<hello, 1>、<world, 1>、<bye, 1>、<world, 1>四个键值对。
    3)Shuffle:如果未定义合并操作,则shuffle进行归并和排序,上述输出变成了<bye, 1>,<hello,1>,<world,<1,1>>。(如果定义了合并操作,最后一项可以变成<world, 2>)
    4)Reduce任务:归并、排序、求和(因为是count任务,所以是求和操作进行聚合)
    5)输出与存储

    7.5 MR的具体应用

    MR可以应用于关系代数运算、分组聚合运算、矩阵-向量乘法、矩阵乘法等。
    所谓关系代数运算,就是指关系型数据库的筛选、并交差、连接等操作。Hadoop中的hive工具,就是把SQL语句转换成MapReduce任务。
    不太懂,略过。

    7.6 MR编程实践

    学会java后再写,掠过。

    相关文章

      网友评论

          本文标题:第7章 MapReduce

          本文链接:https://www.haomeiwen.com/subject/dgtmthtx.html