Spark - Overview
MapReduce
概述
- MapReduce 通过简单的 Map 和 Reduce 的抽象提供了一个编程模型
- 可以在一个由上百台机器组成的集群上并发处理大量的数据集,而把计算细节隐藏起来
- 各种各样的复杂数据处理都可以分解为 Map 和 Reduce 的基本元素
- 复杂的数据处理可以分解成由多个 Job(包含一个 Mapper 和一个 Reducer)组成的 DAG
- 然后,将每个 Mapper 和 Reducer 放到 Hadoop 集群上执行,得到最终结果
不足
- 高昂的维护成本
- 时间性能不达标
- MapReduce 模型的抽象层次低
- 大量的底层逻辑需要开发者手工完成 - 用汇编语言开发游戏
- 只提供 Map 和 Reduce 操作
- 很多现实的数据处理场景并不适合用这个模型来描述
- 实现复杂的操作需要技巧,让整个工程变得庞大且难以维护
- 维护一个多任务协调的状态机成本很高,且扩展性很差
- 在 Hadoop 中,每个 Job 的计算结果都会存储在 HDFS 文件存储系统中
- 每一步计算都要进行硬盘的读取和写入,大大增加了系统的延迟
- MapReduce 对于迭代算法的处理性能很差,而且非常耗资源
- 因为迭代的每一步都要对 HDFS 进行读写
- MapReduce 只支持批处理,缺乏对流处理的支持
Spark
优点
- Spark 最基本的数据抽象称为弹性分布式数据集(Resilient Distributed Dataset - RDD)
- RDD 代表一个可以被分区的只读数据集
- RDD 内有很多分区(Partition),分区内有大量的数据记录(Record)
- RDD 是 Spark 最基本的数据结构
- Spark 定义了很多对 RDD 的操作
- 对 RDD 的任何操作都可以像函数式编程中操作内存中的集合一样直观简便 - 代码简短高效
- Spark 提供了很多对 RDD 的操作
- 如 Map、Filter、flatMap、groupByKey、Union 等,极大地提升了对各种Union的支持
- 不再需要挖掘 MapReduce 模型的潜力,也不用维护复杂的 MapReduce 状态机
- 相比于 Hadoop 的 MapReduce 会将中间数据存放在 HDFS(硬盘)中
- Spark 会将中间数据缓存在内存中,减少由于硬盘读写而导致的延迟,大大加快处理速度
- Spark 可以把迭代过程中的每一步的计算结果都缓存在内存中,非常适用于各类迭代算法
- Spark 第一次启动时需要将数据载入到内存,之后的迭代可以直接在内存里利用中间结果做不落盘的运算
- 对于 AI 来说,Spark 是更好的数据处理引擎
- 在任务级别上,Spark 的并行机制是多线程模型,而 MapReduce 是多进程模型
- 多进程模型便于细粒度控制每个任务占用的资源,但会消耗更多的启动时间
- Spark 同一节点上的任务是以多线程的方式运行在同一个 JVM 进程中
- 更快的启动时间、更高的 CPU 利用率、更好的内存共享
- Spark 对 MapReduce 进行了很多改进,使得性能提升很大
Hadoop 为 **O(N)**,而 Spark 为 O(1)
Hadoop
- Spark 并不是完全替代 Hadoop 的全新工具
- Hadoop 包含很多组件
- 数据存储层 - 分布式文件存储系统 HDFS、分布式数据库存储 HBase
- 数据处理层 - 进行数据处理的 MapReduce、负责集群和资源管理的 YARN
- 数据访问层 - Hive、Pig、Mahout
- 从侠义上来说,Spark 只是 MapReduce 的替代方案
- 在大部分应用场景中,需要依赖 HDFS 和 HBase 来存储数据,依赖 YARN 来管理集群和资源
- Spark 并非依附于 Hadoop,同样可以运行在 Kubernetes 等平台上
- Spark 是通用的数据处理平台,有 5 个主要的扩展库,与 Spark Core 高度整合,广泛应用于多个场景
- 支持结构化数据的 Spark SQL
- 处理实时数据的 Spark Streaming
- 用于机器学习的 MLlib
- 用于图计算的 GraphX
- 用于统计分析的 SparkR
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.