Spark是什么
Spark是开源分布式计算引擎,用于大规模数据分析
Spark特点
速度快:在内存时的运行速度是Hadoop MapReduce的10~100倍
易用:支持Java、Scala、Python、R、SQL等多种语言的API,可以使用基于Scala、Python、R、SQL的Shell交互式查询
通用:提供了一个完整的技术栈
兼容:可以运行在Hadoop Yarn、Apache Mesos、K8s、Spark StandAlone等集群中,可以访问HBase、HDFS、Hive、Cassandra在内的多种数据库
Spark部署模式
本地模式
所有Spark组件和Spark应用程序都在同一台机器上运行。适合于本地开发和测试
集群模式
在集群模式下,还可以选择client模式和cluster模式运行应用程序。client模式是driver程序运行在提交作业的客户端机器上,适合开发环境;cluster模式是driver程序在集群中运行,适合生产环境
standalone模式
Spark自带的集群管理器,不依赖其他系统。适用于中小规模集群
yarn模式
在yarn上运行,由yarn负责资源管理,Spark负责任务调度和计算。适用于hadoop集群
mesos模式
在mesos上运行,由yarn负责资源管理,Spark负责任务调度和计算。适用于mesos集群
k8s模式
在k8s上运行,由k8s负责资源管理,Spark负责任务调度和计算。适用于k8s集群
云服务模式
在云平台(AWS EMR、Google Dataproc、Azure HDinsight、阿里云E-MapReduce)上运行,由云平台负责资源管理
Spark框架模块
Spark Core
功能:包含Spark的基本功能,包括任务调度、内存管理、存储管理、容错机制等,内部采用RDD数据抽象,并提供了很多API来创建和操作RDD,为其它组件提供底层服务。
用途:支持其它高层组件的运行,为开发者提供底层API
Spark SQL
功能:用于结构化数据处理的模块,支持使用SQL查询Hive、HBase等多种外部数据源中的数据,可以和Spark的RDD API无缝集成
用途:查询结构化数据,与Hive集成,支持HiveQL查询
Spark Streaming
功能:用于实时数据流进行处理和分析,接受来自Kafka、Flume等多种数据源的实时数据
用途:实时日志分析、实时监控和报警
MLlib
功能:机器学习库,提供了常见的机器学习算法和工具,包括分类、回归、聚类、协同过滤等常见算法,以及模型评估、数据预处理等功能
用途:机器学习模型训练和部署
GraphX
功能:图计算框架,用于处理图结果数据
用途:社交网络分析、网页排名
Spark运行架构
从资源管理层面,Spark有Master和Worker节点。Master负责集群资源管理,分配Application到Worker节点,维护Worker节点、Driver和Application的状态。Worker节点负责具体任务的执行。
从程序运行层面,Spark有Driver和Executor。Driver充当单个Spark任务运行过程中的管理者,Executor充当单个Spark任务运行过程中的执行者。
Cluster Manager
是Spark集群资源管理器,存在于Master节点上,主要用于对整个集群资源进行管理和分配
Worker
是Spark的工作节点,用于执行提交的任务,主要的工作职责有:
- 通过注册机制想Cluster Manager汇报自身的CUP、内存等资源使用信息
- 在集群管理器的指示下,创建并启用Executor
- Cluster Manager将资源和Task分配给Worker节点上的Executor执行
- Worker节点同步Executor状态和资源信息给Cluster Manager
Executor
是真正执行计算任务的组件,是Application运行在Worker上的一个进程。这个进程负责Task的运行,并将数据保存在内存或者磁盘中,也能够将结果返回给Driver
Application
是基于Spark API编写的应用程序,包括实现Driver功能的代码和集群中各个Executor上要执行的代码。一个Application由多个Jobs组成,其中Application的入口是用户定义的main()方法
Driver
是Spark的驱动器节点,可以运行在Application节点上,也可以由Application提交给Cluster Manager,再由Cluster Manager安排Worker进行运行,其主要的工作职责有:
- Application通过Driver跟Cluster Manager及Executor进行通信
- 运行Application的main()函数
- 创建SparkContext
4.划分RDD并生成DAG
5.创建Job并将每个Job拆分为多个Stage,每个Stage由多个Task构成,也被称为Task Set
6.生成并发送Task到Executor
7.在各个Executor进程间协调Task的调度
8.与Spark中的其他组件进行资源协调
Spark运行流程
- 启动Driver,创建SparkContext
- Client提交程序给Driver,Driver向Cluster Manager申请集群资源
- 资源申请完毕,在Worker中启动Executor
- Driver将应用程序转化为Tasks,分发给Executor执行
- Driver从Executor收集计算结果,将结果保存下来或者返回给用户
- 应用程序执行完成后,Driver向Cluster Manager释放申请的资源