MapReduce

概述

  1. MapReduce 通过简单的 MapReduce抽象提供了一个编程模型
    • 可以在一个由上百台机器组成的集群上并发处理大量的数据集,而把计算细节隐藏起来
  2. 各种各样的复杂数据处理都可以分解为 MapReduce基本元素
    • 复杂的数据处理可以分解成由多个 Job(包含一个 Mapper 和一个 Reducer)组成的 DAG
    • 然后,将每个 MapperReducer 放到 Hadoop 集群上执行,得到最终结果

不足

  1. 高昂的维护成本
  2. 时间性能不达标
  3. MapReduce 模型的抽象层次低
    • 大量的底层逻辑需要开发者手工完成 - 用汇编语言开发游戏
  4. 只提供 MapReduce 操作
    • 很多现实的数据处理场景并不适合用这个模型来描述
    • 实现复杂的操作需要技巧,让整个工程变得庞大难以维护
    • 维护一个多任务协调的状态机成本很高,且扩展性很差
  5. Hadoop 中,每个 Job计算结果都会存储在 HDFS 文件存储系统中
    • 每一步计算都要进行硬盘的读取和写入,大大增加了系统的延迟
  6. MapReduce 对于迭代算法处理性能很差,而且非常耗资源
    • 因为迭代的每一步都要对 HDFS 进行读写
  7. MapReduce 只支持批处理,缺乏对流处理的支持

Spark

优点

  1. Spark 最基本的数据抽象称为弹性分布式数据集(Resilient Distributed Dataset - RDD
  2. RDD 代表一个可以被分区只读数据集
    • RDD 内有很多分区Partition),分区内有大量的数据记录Record
  3. RDD 是 Spark 最基本的数据结构
    • Spark 定义了很多对 RDD 的操作
    • 对 RDD 的任何操作都可以像函数式编程操作内存中的集合一样直观简便 - 代码简短高效
  4. Spark 提供了很多对 RDD 的操作
    • 如 Map、Filter、flatMap、groupByKey、Union 等,极大地提升了对各种Union的支持
    • 不再需要挖掘 MapReduce 模型的潜力,也不用维护复杂的 MapReduce 状态机
  5. 相比于 Hadoop 的 MapReduce 会将中间数据存放在 HDFS硬盘)中
    • Spark 会将中间数据缓存在内存中,减少由于硬盘读写而导致的延迟,大大加快处理速度
  6. Spark 可以把迭代过程中的每一步的计算结果都缓存在内存中,非常适用于各类迭代算法
  7. Spark 第一次启动时需要将数据载入到内存,之后的迭代可以直接在内存里利用中间结果不落盘的运算
    • 对于 AI 来说,Spark 是更好的数据处理引擎
  8. 任务级别上,Spark并行机制多线程模型,而 MapReduce多进程模型
    • 多进程模型便于细粒度控制每个任务占用的资源,但会消耗更多的启动时间
    • Spark 同一节点上的任务是以多线程的方式运行在同一个 JVM 进程
      • 更快的启动时间、更高的 CPU 利用率、更好的内存共享
  9. Spark 对 MapReduce 进行了很多改进,使得性能提升很大

Hadoop 为 **O(N)**,而 Spark 为 O(1)

image-20241117215035247

Hadoop

  1. Spark 并不是完全替代 Hadoop 的全新工具
  2. Hadoop 包含很多组件
    • 数据存储层 - 分布式文件存储系统 HDFS、分布式数据库存储 HBase
    • 数据处理层 - 进行数据处理的 MapReduce、负责集群和资源管理的 YARN
    • 数据访问层 - Hive、Pig、Mahout
  3. 从侠义上来说,Spark 只是 MapReduce 的替代方案
    • 在大部分应用场景中,需要依赖 HDFSHBase存储数据,依赖 YARN管理集群和资源
  4. Spark 并非依附于 Hadoop,同样可以运行在 Kubernetes 等平台上
  5. Spark 是通用的数据处理平台,有 5 个主要的扩展库,与 Spark Core 高度整合,广泛应用于多个场景
    • 支持结构化数据Spark SQL
    • 处理实时数据Spark Streaming
    • 用于机器学习MLlib
    • 用于图计算GraphX
    • 用于统计分析SparkR

image-20241117221227214