• 谈谈Hadoop MapReduce和Spark MR实现


    谈谈MapReduce的概念、Hadoop MapReduce和Spark基于MR的实现

    什么是MapReduce?

    MapReduce是一种分布式海量数据处理的编程模型,用于大规模数据集的并行运算。

    有以下几个特点:

    • 分而治之,并行处理。

      抽象了map和reduce的计算流程,对于分布式存储的数据可以并行的进行map处理,之后在reduce端对map结果进行汇总。

    • 移动计算而非移动数据。

      数据的计算传输需要大量的磁盘和网络IO。MapReduce会尽量在数据存储的节点执行计算,以减少不必要的开销。

    Hadoop MapReduce

    我们常说的MapReduce就是Hadoop MapReduce。

    Hadoop MapReduce作业被分成一系列运行在分布式集群中的map任务和reduce任务,每个任务都工作在被指定的小的数据自己上,因此负载是遍布集群中各个节点上的。

    map任务负责数据的载入、解析、转换和过滤。MapReduce作业的输入是一系列储存在HDFS中的文件。map任务的输出被称为中间键和中间值,会被发送到reduce端进行后续处理。

    每个reduce任务负责处理map任务输出结果的一个子集。MapReduce确保每个reduce的输入都是按键排序的。

    系统执行排序、将map输出作为输入传递给reduce的过程称为shuffle。shuffle是MapReduce的心脏,关于shuffle详情请自己搜索。


    Pig和Hive都是对MapReduce更高层次的抽象,他们都会将高级的语言翻译成一组MapReduce作业,执行计算。

    Spark基于MapReduce实现

    Spark通过借鉴Hadoop MapReduce,继承了其分布式并行计算的优点,并改进了MapReduce的一些缺点。

    Spark并行处理主要基于其内部RDD和DAG来实现。

    RDD(弹性分布式数据集):作为Spark基本编程模型,它是MapReduce模型的扩展和延伸。其运用高效的数据共享概念(分区)和类似MapReduce的操作方式,使得并行计算能高效的进行。

    DAG(有向无环图):Spark使用DAG描述了RDD的依赖关系(宽/窄依赖),维护了RDD间的血缘关系,减少了迭代过程中数据的落地,提高了处理效率。


    我们提交一个Spark代码,大概执行流程如下:

    1. 根据行动操作划分job
    2. 每个job内部根据宽依赖划分stage。stage分为ShuffleMapStage和ResultStage。
    3. 执行stage内部的task。每个stage内部会有许多task,task是Spark的最小执行单元,task的数量取决于RDD的分区数量,spark会优先选择数据所在的节点启动task。task分为ShuffleMapTask和ResultTask。ShuffleMapTask返回输出结果相关信息供后续task使用;ResultTask根据结果大小,会选择丢弃或者返回给Driver端。
    4. ......

    从上面流程,我们可以简单总结:

    • Spark通过RDD的分区,来保证MR中的并行处理
    • Spark通过DAG宽窄依赖,优化了task计算流程,减少了数据落盘的次数
    • Spark中也会保障数据本地化,来实现移动计算而非移动数据。

    Spark与MapReduce比较

    1. Spark会中间数据放在内存中,迭代运算效率高。MapReduce的中间计算结果保存在磁盘上,势必影响整体的运行速度。
    2. Spark的容错性高。Spark的RDD可以根据血统来重新生成数据,也可以通过checkpoint来实现容错。
    3. Spark更加的通用。Spark提供了许多的算子,可以更便捷的处理数据。

    参考

    《MapReduce设计模式》

    《Hadoop权威指南》

    《图解Spark核心技术与案例实践》


    参考书籍+个人理解,如有偏差,欢迎交流。

  • 相关阅读:
    asp复制到word实现分页效果
    玩转网络MAC地址
    取消开机画面的登录
    C#调用vc的dll.设置参数等
    C++中类的静态数据成员函数解析
    吉林大学vc6.0视频记录
    根据进程号获取程序名
    (转)C#中Split分隔字符串的应用(C#、split、分隔、字符)
    MSSQL表别名使用注意事项
    (转)ArrayList 与 string[] 的转换
  • 原文地址:https://www.cnblogs.com/upupfeng/p/13386631.html
Copyright © 2020-2023  润新知