Spark架构基本介绍

简介

  • 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等多种数据源

生态系统

imgTemp.png
  • 第一层:各种文件存储系统
  • 第二层:部署模式(详细信息下面介绍)
  • 第三层: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):

    • 6264117-7e695db53e63fa44.png
    • 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):

    • 6264117-9773993abf0e2521.png
    • 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):
    • 6264117-8a0b34d10b5b7ae0.png
    • 在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:


      4797877-affe70f7ded9c18b.png
      • 在集群中启动多个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进行任务的启动、调度等。

你可能感兴趣的:(Spark架构基本介绍)