Spark基础与架构
Spark是一个开源的分布式计算系统,它提供了一个快速、通用的集群计算平台
Spark 是什么?
- 快速:
- Spark的核心是一个分布式内存计算框架,它能够将数据加载到内存中进行处理,这使得它在处理速度上比Hadoop MapReduce快100倍以上。
- 支持迭代计算和交互式数据挖掘,适合机器学习等需要多次迭代计算的场景。
- 易用性:
- Spark提供了丰富的API,支持Scala、Java、Python和R等多种编程语言,使得开发者可以快速上手。
- 它还提供了DataFrame和Dataset API,这些高级抽象使得数据操作更加直观和易于管理。
- 通用性:
- Spark不仅仅是一个MapReduce模型的替代品,它还提供了SQL查询(通过Spark SQL)、机器学习(通过MLlib)、图计算(通过GraphX)和流式数据处理(通过Spark Streaming)等多种计算功能。
- 这使得Spark可以处理不同类型的数据处理和分析任务,而不需要依赖于多个不同的系统。
- 可扩展性:
- Spark可以在多种集群管理器上运行,如Hadoop YARN、Apache Mesos以及Spark自己的Standalone模式。
- 它可以轻松地从单个服务器扩展到数千个节点。
- 容错性:
- Spark提供了RDD(弹性分布式数据集),这是一种可以容错的数据结构,能够在节点失败时重新计算丢失的数据分区。
- 通过血统(Lineage)机制,Spark能够优化 计算和存储资源的使用。
- 内存计算:
- Spark的内存计算能力使其在处理需要快速迭代和复杂转换的大数据集时具有显著优势。
- 集成性:
- Spark可以与Hadoop生态系统中的其他组件(如HDFS、HBase)以及Apache Kafka等数据源集成,方便数据的读写。
- 丰富的库支持:
- Spark拥有强大的库支持,包括用于SQL查询的Spark SQL、用于机器学习的MLlib和用于图计算的GraphX。
- 社区支持:
- Spark拥有一个活跃的开源社区,不断有新的功能和改进被加入,同时社区也提供了大量的文档和教程。
- 商业支持:
- 除了开源社区,Spark也有商业支持,例如Databricks,它提供了一个基于Spark的统一分析平台。
Spark 和 Hadoop 的区别
Spark | Hadoop | |
---|---|---|
计算模型 | 以内存计算为核心,重要计算任务主要在内存中进行,避免了大量的磁盘 I/O 操作,极大地提升了速度。 | 主要采用磁盘计算模式,数据存储和计算过程中需要多次读写磁盘,速度较慢,但适合处理批量性和持久化要求高的任务。 |
执行引擎与框架 | Spark 具备独立的 DAG(有向无环图)任务调度引擎,可以优化任务的执行顺序,灵活调度资源。Spark 兼容 Hadoop 的 HDFS 与 YARN,但本身也有独立的部署模式。 | Hadoop 核心是 HDFS(分布式文件系统)和 MapReduce(分布式计算框架)。MapReduce 采用“Job Tracker + Task Tracker”模式,执行效率相对不如 Spark。 |
编程模型与语言支持 | 提供 RDD(弹性分布式数据集)编程模型,以及 Dataset 和 DataFrame 高层次抽象接口。支持多语言(Scala、Java、Python 和 R)。 | 以 MapReduce 的键值对编程模型为主,多数情况下需要开发者手动处理复杂的任务拆分与合并。Hadoop 原生支持的编程语言是 Java,其他语言需要配合 Hadoop Streaming 实现。 |
容错机制 | 通过RDD的血统(Lineage)机制实现容错 | 通过HDFS的复制机制实现数据的高可用性和容错 |
适用场景 | 适用于机器学习、实时数据处理、交互式查询、高频迭代任务等需要高计算速度的场景 | 适合处理大规模离线的批处理任务,且对数据持久化要求高,适用于数据存储和归档等场景。 |
Spark 为什么快?
-
Spark之所以快,主要归功于以下几个关键因素:
- 内存计算:
- Spark支持将数据保留在内存中进行处理,这大大减少了与磁盘I/O操作相关的延迟。内存中的数据访问速度比磁盘快得多,从而加快了数据处理速度。
- 惰性计算和智能优化:
- Spark使用惰性计算(Lazy Evaluation),意味着它不会立即执行计算,而是等到需要结果时才进行。这种机制允许Spark优化整个计算图,合并多个操作以减少任务数量和数据传输。
- 高效的执行引擎:
- Spark的执行引擎能够智能地优化执行计划,包括预测任务的执行顺序和数据分区,以减少数据的移动和提高并行处理效率。
- 血统(Lineage)机制:
- 当数据因为节点故障而丢失时,Spark可以通过血统信息重新计算丢失的数据,而不是像Hadoop那样重新启动整个作业,这减少了容错所需的时间。
提示Spark比MapReduce快,主要是因为它以内存计算为核心,优化了数据处理流程,减少了对磁盘I/O的依赖,而MapReduce主要设计为磁盘计算,即使在有内存资源的情况下也倾向于将数据写入磁盘。
- 内存计算:
Spark 是怎么基于内存计算的?
-
RDD(弹性分布式数据集) 内存存储 Spark的核心数据结构RDD支持将数据缓存在内存中,这是内存计算的基础。当对RDD执行缓存(cache())或持久化(persist())操作时,数据会优先存储在内存中,大大减少了重复计算的开销。不同的持久化级别可以根据内存资源和计算需求进行灵活选择,如MEMORY_ONLY、MEMORY_AND_DISK等。
-
内存数据共享 在分布式计算过程中,Spark通过将中间计算结果保存在内存中,避免了频繁的磁盘I/O。多个作业和任务可以共享这些内存中的数据,显著提高了计算效率。特别是对于迭代型算法和机器学习任务,内存共享能带来巨大的性能提升。
-
内存计算调度 Spark的任务调度器能智能地将计算任务分配到最靠近数据的节点上,并尽可能地利用内存进行计算。通过最小化数据移动和最大化内存使用,Spark能够显著降低计算开销。
-
shuffle操作优化 在shuffle过程中,Spark尽可能地将中间结果保存在内存中,而不是写入磁盘。这种设计大大减少了磁盘I/O,提高了数据处理的整体性能。
-
内存管理与动态分配 Spark提供了灵活的内存管理机制,可以动态地在存储内存和计算内存之间进行资源分配。这种动态调整能力确保了内存资源的高效利用,并能根据实际任务需求进行实时优化。
-
DataFrame和Dataset的内存优化 在高级API如DataFrame和Dataset中,Spark还引入了编码器(Encoder)和内存列存储等技术,进一步提升了内存计算的效率。这些技术能够对数据进行压缩和快速序列化,减少内存占用并加速计算。
-
广播变量 通过广播变量机制,Spark可以将只读的大数据集高效地分发到各个工作节点的内存中,避免了数据的重复传输,降低了网络开销。