简介
- Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。
- Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架
优点
- 快速:spark有先进的DAG执行引擎,支持循环数据流和内存计算;spark在内存中的执行速度是MR的100倍,在磁盘上的运行速度是MR的10倍
- 易用:SPARK支持使用Java/Scala/Python/Sql语言快速编写应用,提供统一API,使得 编写应用程序更容易。编写应用程序更容易
- 通用:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件
- 运行模式多样:可运行于独立的集群模式中,可运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS/Cassandra/HBase/Hive等多种数据源
生态系统
- 第一层:各种文件存储系统
- 第二层:部署模式(详细信息下面介绍)
- 第三层:spark core是spark的核心组件,其操作对象是RDD(弹性分布式数据集),可以说是spark中的离线计算框架
- 第四层:处理流式数据的spark streaming;执行sql的sparksql;用于机器学习的MLlib;用于图计算的GraphX
术语介绍
- Application: Spark Application指的是用户编写的Spark应用程序,包含了一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码
- Master:主控节点,负责接收Client提交的作业,管理worker,并命令worker启动Driver和Executor
- Worker:集群中任何可以运行Application代码的节点,类似于YARN中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点
- Driver:一个spark作业运行时包括一个driver进程,负责DAG图的构成,Stage的划分、Task的管理
- Executor: Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在 内存或者磁盘上,每个Apptication都有各自独立的一批 Executor
- Job: 包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job
- Stage: 每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方
- Task: 被送到某个Executor上的工作单元,但hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责
- Local模式:本地模式部署在单机,主要用于测试或实验;最简单的运行模式,所有进程都运行在一台机器的 JVM 中;本地模式用单机的多个线程来模拟Spark分布式计算,通常用来验证开发出来的应用程序逻辑上有没有问题
- cluster模式:
- standalone:Spark可以通过部署与Yarn的架构类似的框架来提供自己的集群模式。该集群模式的架构设计与HDFS和Yarn大致相同,都是由一个主节点多个从节点组成;主:master,从:worker
- spark on yarn:yarn-cluster是基于yarn集群进行调度管理的,yarn集群上有ResourceManager(RM)和NodeManager(NM)两个角色。在YARN中,每个Application实例都有一个Application Master进程,它是Application启动的第一个容器。它负责和ResourceManager打交道,并请求资源。获取资源之后告诉NodeManager为其启动container
- yarn-client与yarn-cluster的区别:其实就是Application Master(AM)进程的区别(即Driver运行在哪)
- yarn-client模式下,driver运行在客户端,也就是提交作业的机器上;ApplicationMaster仅仅向YARN请求executor,client会和请求的container通信来调度他们工作,也就是说Client不能离开
- yarn-cluster模式下,driver运行在集群的AM中,它负责向YARN申请资源,并监督作业的运行状况;作业提交完就可以关掉Client,作业会继续在YARN上运行
任务提交流程
-
standlone模式(http://spark.apache.org/docs/latest/spark-standalone.html):
1.spark-submit 提交任务给 Master
2.Master 收到任务请求后通过 LaunchDriver 向 Worker 请求启动 Driver
3.Worker 收到请求后启动 Driver
4.Driver 启动后向 Master 注册(用户App信息)。
5.Master 收到 App 信息后根据资源的情况向 Worker 发送 launchExecutor 启动 Excutor
6.Worker 收到 Master 的请求后启动相应的 Excutor
7.Excutor 启动后负责与 Driver 通信, 执行相关任务
-
yarn-cluster模式(http://spark.apache.org/docs/latest/running-on-yarn.html):
- 1.由client向RM提交请求,并上传jar到HDFS上,这期间包括四个步骤:
- a).连接到RM
- b).从 RM ASM(Applications Manager)中获得metric、queue和resource等信息
- c).上传 app jar and spark-assembly jar
- d).设置运行环境和container上下文(launch-container.sh等脚本)
- 2.ASM 向 Scheduler 申请空闲 container
- 3.Scheduler 向 ASM 返回空闲 container 信息(NM 等)
- 4.RM(ASM)根据返回信息向 NM 申请资源
- 5.NM 分配创建一个container 并创建Spark Application Master(AM),此时 AM 上运行的是 Spark Driver(每个SparkContext都有一个 AM)
- 6.AM启动后,和RM(ASM)通讯,请求根据任务信息向RM(ASM)申请 container 来启动 executor
- 7.RM(ASM)将申请到的资源信息返回给AM
- 8.AM 根据返回的资源信息区请求对应的 NM 分配 container 来启动 executor
- 9.NM 收到请求会启动相应的 container 并启动 executor
- 10.executor 启动成后 反向向 AM 注册
- 11.executor 和 AM(Driver) 交互 完成任务
- 12.后续的DAGScheduler、TaskScheduler、Shuffle等操作都是和standaloe一样
- 13.等到所有的任务执行完毕后,AM 向 ASM 取消注册并释放资源
- yarn-client模式(http://spark.apache.org/docs/latest/running-on-yarn.html):
- 在yarn-client模式下,Driver运行在Client上,通过ApplicationMaster向RM获取资源。本地Driver负责与所有的executor container进行交互,并将最后的结果汇总。整体的过程与yarn-cluster类似。
- 不同点在于 Driver 是运行在本地客户端,它的 AM 只是作为一个 Executor 启动器,并没有 Driver 进程。
- 而且 Executor启动后是与 Client 端的 Driver 进行交互的,所以 Client 如果挂了 任务也就挂了。
高可用性(High Available)
- Spark同样存在单点故障问题,官方说明中的两种HA方式:
-
Standby Masters with ZooKeeper:
- 在集群中启动多个Master节点,连接到ZK的实例中,利用ZK来存储状态和进行Leader选举
- 只有一个Master节点处于Active状态,其他都是Standby状态
- 一旦ZK监听不到当前的Leader的心跳,另一个Standby Master就会被选举为Leader,然后恢复调度,继续任务
- 整个恢复过程(从主节点第一次down掉开始)应在1到2分钟之间完成
- 请注意,此延迟仅影响对新应用程序的调度,主节点故障切换期间已经运行的应用程序不受影响
- Single-Node Recovery with Local File System:
- ZooKeeper is the best way to go for production-level high availability, but if you just want to be able to restart the Master if it goes down, FILESYSTEM mode can take care of it
- In order to enable this recovery mode, you can set SPARK_DAEMON_JAVA_OPTS in spark-env using this configuration:
-
System property | Meaning | Since Version |
---|---|---|
spark.deploy.recoveryMode | Set to FILESYSTEM to enable single-node recovery mode (default: NONE). | 0.8.1 |
spark.deploy.recoveryDirectory | The directory in which Spark will store recovery state, accessible from the Master's perspective. | 0.8.1 |
后记
- 在yarn-client、yarn-cluster提交模式中,可以不启动Spark集群,因为相关的jvm环境有yarn管理(启动、结束等)
- standalone 提交模式中 Spark集群一定要启动,因为需要依赖worker、Master进行任务的启动、调度等。