Apache Spark分布式计算框架架构详解
Apache Spark分布式计算框架架构详解
Apache Spark是一个广泛使用的分布式计算框架,以其高速计算、易用性和丰富的生态系统而闻名。本文将从架构组件、运行时结构到具体特点,全面解析Spark的核心原理和功能。
一、概述
Apache Spark是由美国加州大学伯克利分校的AMP实验室开源的通用并行框架。与Hadoop MapReduce相比,Spark最大的优势在于它能够将中间结果保存在内存中,而不是每次都写入磁盘,这使得Spark在处理迭代计算任务时具有显著的速度优势。
Spark引入了弹性分布式数据集(RDD)的概念,这不仅提高了交互式查询的效率,还优化了迭代计算的工作负载。这种设计使得数据挖掘和机器学习等需要多次迭代的算法更容易实现。
官方网站:spark.apache.org
二、Apache Spark架构组件栈
2.1 概述
Spark基于Spark Core构建了多个核心组件,包括Spark SQL、Spark Streaming、MLlib、GraphX和SparkR,这些组件可以实现不同类型的数据处理任务。Spark支持多种运行模式,如本地模式、独立模式(Standalone)、Mesos模式和YARN模式。数据源方面,Spark可以从HDFS、S3、Hypertable、HBase或Cassandra等多种存储系统中读取数据。
2.2 架构图
2.3 架构分层组件说明
2.3.1 支持数据源
Spark可以从多种数据源中读取数据,包括HDFS、S3、Hypertable、HBase和Cassandra等。
2.3.2 调度运行模式
Spark支持多种运行模式,包括本地模式、独立模式(Standalone)、YARN模式、Mesos模式以及在AWS等公有云平台上的运行模式。
2.3.3 Spark Core核心
Spark的核心功能包括基础设施、存储系统、调度系统和计算引擎。
基础设施:Spark包含许多基础设施组件,如SparkConf(配置信息)、SparkContext(Spark上下文)、Spark RPC(远程过程调用)、ListenerBus(事件总线)、MetricsSystem(度量系统)和SparkEnv(环境变量)等。
存储系统:Spark的存储系统优先考虑在内存中存储数据,当内存不足时才会将数据存储到磁盘。这种内存优先的策略使得Spark在实时流计算和批量计算场景下都能表现出色。
调度系统:Spark的调度系统由DAGScheduler和TaskScheduler组成。DAGScheduler负责创建Job、划分Stage、为Stage创建Task并批量提交Task。TaskScheduler则负责按照FIFO或FAIR等调度算法对Task进行批量调度。
计算引擎:计算引擎包括内存管理器、任务管理器和Task Shuffle管理器等组件。
2.3.4 生态组件
Spark的生态组件包括:
Spark SQL:提供基于SQL的数据处理方式,支持Hive SQL。
Spark Streaming:支持流计算,可以处理来自Kafka、Flume、Kinesis和TCP等多种数据源的流数据。
GraphX:用于分布式图计算,提供了Pregel API来快速解决图计算问题。
Spark MLlib:Spark的机器学习库,提供了统计、分类、回归等多种机器学习算法。
Spark R:一个R语言包,提供了轻量级的R语言使用Spark的方式,支持分布式数据框操作和机器学习。
三、Apache Spark的运行时架构
3.1 概述
Spark的集群架构主要包括Cluster Manager、Worker、Executor、Driver和Application五个组件。
3.2 架构图
3.3 组件角色说明
3.3.1 Cluster Manager
Spark的集群管理器负责整个集群的资源管理和分配。根据部署模式的不同,可以分为Local、Standalone、YARN、Mesos和AWS等模式。
3.3.2 Worker
Spark的工作节点,负责执行提交的任务。其主要职责包括:
- 通过注册机制向Cluster Manager汇报CPU和内存等资源使用信息。
- 在Master的指示下创建并启动Executor。
- 将资源和任务进一步分配给Executor并运行。
- 同步资源信息和Executor状态信息给Cluster Manager。
3.3.3 Executor
Executor是真正执行计算任务的组件,是某个Application运行在Worker上的一个进程。其主要职责包括:
- 运行Task并将结果数据保存到内存或磁盘。
- Task是运行在Executor上的任务单元,Spark应用程序最终被划分为经过优化的多个Task的集合。
3.3.4 Driver
Application的驱动程序,可以理解为驱动程序运行中的main()函数。Driver的主要职责包括:
- 运行应用程序的main()函数。
- 创建SparkContext。
- 划分RDD并生成DAG。
- 构建Job并将每个Job都拆分为多个Task,这些Task的集合被称为Stage。
- 与Spark中的其他组件进行资源协调。
- 生成并发送Task到Executor。
3.3.5 Application
基于Spark API编写的应用程序,其中包括实现Driver功能的代码和在集群中多个节点上运行的Executor代码。Application通过Spark API创建RDD、对RDD进行转换、创建DAG、通过Driver将Application注册到Cluster Manager。
3.4 Spark运行流程
3.4.1 概述
Spark的数据计算主要通过RDD的迭代完成,RDD可以看作是对各种数据计算模型的统一抽象。在RDD的迭代计算过程中,其数据被分为多个分区并行计算,分区数量取决于应用程序设定的Partition数量,每个分区的数据都只会在一个Task上计算。所有分区可以在多个机器节点的Executor上并行执行。
3.4.2 运行流程图
3.4.3 运行流程步骤说明
- 创建RDD对象,计算RDD之间的依赖关系,并将RDD生成一个DAG。
- DAGScheduler将DAG划分为多个Stage,并将Stage对应的Task Set提交到集群管理中心。划分Stage的一个主要依据是当前计算因子的输入是否确定。如果确定,则将其分到同一个Stage中,避免多个Stage之间传递消息产生的系统资源开销。
- TaskScheduler通过集群管理中心为每个Task都申请系统资源,并将Task提交到Worker。
- Worker的Executor执行具体的Task。
四、Spark的特点
4.1 计算速度快
Spark将每个任务都构造成一个DAG来执行,其内部计算过程基于弹性分布式数据集在内存中对数据进行迭代计算,因此其运行效率很高。官方数据显示,如果计算的数据从磁盘上读取,则Spark的速度是Hadoop MapReduce的10倍以上;如果计算的数据从内存中读取,则Spark的计算速度是Hadoop MapReduce的100倍以上。
4.2 易于使用
Spark提供了80多个高级运算操作,支持丰富的算子,开发人员只需要按照其封装好的API实现即可,不需要关心Spark的底层架构。同时,Spark支持多种语言开发,包括Java、Scala、Python。
4.3 通用大数据框架
Spark提供了多种类型的开发库,包括Spark Core、Spark SQL(即时查询)、Spark Streaming(实时流处理)、Spark MLlib、GraphX(图计算),使得开发人员可以在同一个应用程序中无缝组合使用这些库,而不用像传统的大数据方案那样将离线任务放在Hadoop MapReduce上运行,将实时流计算任务放在Storm上运行,并维护多个平台。Spark提供了从实时流计算、MapReduce离线计算、SQL计算、机器学习到图计算的一站式整体解决方案。
4.4 支持多种资源管理器
Spark支持单机、Standalone、Hadoop YARN、Apache Mesos等多种资源管理器,用户可以根据现有的大数据平台灵活地选择运行模式。
4.5 生态圈丰富
Spark生态圈以Spark Core为核心,支持从HDFS、S3、HBase等多种持久化层读取数据。同时,Spark支持以Hadoop YARN、Apache Mesos和Standalone为资源管理器调度Job,完成Spark应用程序的计算。Spark应用程序可以基于不同的组件实现,如SparkShell、Spark Submit、Spark Streaming、SparkSQL、BlinkDB(权衡查询)、MLlib/MLbase(机器学习)、GraphX和SparkR(数学计算)等。Spark生态圈已经从大数据计算和数据挖掘扩展到机器学习、自然语言处理和语音识别等领域。