Spark学习(1)-架构原理

Spark是什么 Spark是基于HDFS等分布式存储之上的数据处理分析框架,它擅长批量数据处理,处理流工作负载,交互式查询,机器学习等;它可以通过standalone模式,yarn-client或者yarn-cluster等模式在hadoop集群中运行;而依托在spark数据处理之上的有Spark Sql,Spark Stream,MLlib,Graphx等组件;
其具体架构示意图如下:

Spark学习(1)-架构原理
文章图片
Spark示意图.png
上图中最上层最组件说明如下:

  • Spark Sql:通过提供Apache Hive的sql查询语句变体HiveQL来与Spark进行交互的API库,每个数据库表都是一个RDD对象,Spark sql查询都将转化为Spark的操作;
  • Spark Streaming:能够提供实时数据流的处理和控制,Spark Streaming允许程序像处理普通RDD对象那样处理实时数据流;
  • MLlib(Machine Learning):机器学习的一些算法库,算法通过Spark 对RDD的操作处理来实现,该库包括可扩展的学习算法,如回归,分类等需要对大数据集进行迭代的算法;
  • GraphX:控制图和并行图操作和计算的算法和工具的集合;
接下来说下Spark架构,Spark架构组成图如下:

Spark学习(1)-架构原理
文章图片
Spark组成.png 如上图,在Spark架构中有以下几个组成:
  • Driver Pragram:Application的driver程序,用来运行Application的main函数以及创建SparkContext进程来准备Application的运行环境;
  • SparkContext:SparkContext在Spark中用来和ClusterManager进行通信,申请资源,分配和监控任务;
  • ClusterManager:负责集群资源的管理和分配的节点,它会通过心跳的方式来监控workerNode,在Standalone模式中,它就是Master,在Yarn模式中,它就是Resource Manager;
  • WorkNode:集群中的从节点,用来负责计算和控制的节点,可以启动Exector或者Driver;
  • Executor:Application的Executor程序,ClusterManager会为Application的每个Executor分配一个进程,采用线程池分配的方式来执行TaskSet;
  • Task:Executor上执行任务的基本单位;多个Task可以构成一个Stage;
Spark怎么运行 Spark运行流程图如下:

Spark学习(1)-架构原理
文章图片
Spark运行.png 流程讲解如下:
    1. Application程序启动Driver程序,创建SparkContext;
  • 2.SparkContext向资源管理器申请运行Executor节点资源,Executor节点启动SatandaloneExectuorBackend,Exectuor会定期向资源管理器上报资源使用情况;
    1. Executor节点向SparkContext申请Task,然后SparkContext将Application中的Executor程序发送给Executor;
  • 4.SparkContext会将RDD objects构建成DAG(有向无环图),然后发送给DAG Scheduler;
    1. DAG Scheduler会将DAT拆分为多个Stage,每个Stage都是由多个Task组成;然后将TaskSet发送给TaskScheduler;
    1. TaskScheduler会将TaskSet中的Task提交给Exectutor运行,Executor将采用线程池的方式运行这些Tasks; Executor会在Tasks运行完成后会释放所有资源;
流程术语如下:
  • Application:用户编写的Spark应用程序,包括一个Driver程序和多个Executor程序;
  • Driver:Driver是运行Driver程序的一个节点,它会运行Application的main函数,创建SparkContext,SparkContext用来准备Application的运行环境,它可以和ResourceManager通信,申请资源,分配和监控任务;当Executor执行完最后的任务时,Driver同时负责将SparkContext关闭,一般情况下Diver可以理解为SparkContext;
  • Executor: Executor是运行Application中Executor程序的一个进程,该进程会和SparkContext保持通信,并负责某些Task的处理,然后将数据保存到内存或者磁盘;在Spark on Yarn模式中,该进程名为CoarseGrainedExecutor Backend,CoarseGrainedExecutorBackend只有一个Executor对象,通过将task包装秤TaskRunner,然后交给线程池中某个线程来执行,这样Executor能并行执行的task数就与分配给它的cpu数有关;
  • Worker:在Spark集群中能够运行Application程序的节点,Standalone模式下是通过slave文件配置的节点;而在Yarn模式下则指的是NodeManager;
  • ClusterManager: 集群资源管理,负责集群资源的管理和监控,在不同运行模式下有不同的类型:
    • Standalone模式:Spark原生的资源管理器,由Master来负责资源的管理和分配;
    • Apache Mesos模式下:Apache Mesos是一种与Hadoop结合很好的资源调度框架;
    • Yarn模式:指的是ResourceManager;
  • job:是包含多个task的并行计算,由Spark Action触发,一个Application会产生多个job;
  • task: 是由Executor负责执行的工作单元,和HadoopMR中的MapTask和ReduceTask概念一致,由TaskScheduler负责调度和分配,多个task可以组成一个stage;
  • stage:每个job都可以划分成多组Task,作为一个taskSet,叫做stage; stage由DAGScheduler进行拆分和调度,拆分的依据是根据RDD Object之间的依赖关系找出开销最小的方法;stage分为非最终stage(shuffle Map stage)和最终stage(Result stage),这两种stage的边界就是发生shuffle的地方;
  • DAGScheduler:DAGScheduler是Driver中根据job构建成stage的调度器,然后将构建后的stage交给TaskScheduler;
  • TaskScheduler:TaskScheduler是Driver中用来向Executor分配Task和维护所有taskset的调度器,当Executor向Driver发送心跳时,TaskScheduler会根据资源剩余情况向Executor分配的任务;同时TaskScheduler还维护每个TaskSet的运行标签,包括失败和重试的次数;在不同模式下TaskScheduler名称不一样:
    • Spark on Standalone:名称为TaskScheduler;
    • yarn-client模式下为: YarnClientClusterScheduler;
    • yarn-cluster模式下为:YarnClusterScheduler;
将流程术语串起来就得到了Spark 运行层次图如下:

Spark学习(1)-架构原理
文章图片
Spark运行.png 一个spark可以有多个stage,每个stage由同种task构成,task可以分为shuffleMapTask和ResultTask,其中
Dependency也分为ShuffleDependency和NarrowDependency;
Spark运行模式有哪些 Spark运行模式比较丰富,运行在单机上可以有:本地模式和伪分布式模式;运行在分布式环境下,根据结合的资源调度框架又有不同的划分,本文就介绍:Spark内建的Standalone模式和Yarn-client模式和Yarn-cluster模式
Standalone模式(独立模式)
Standalone模式是Spark内建的一种资源调度框架,它采用Master/Slave模式,通过zookeeper来保证Master的高可用,其框架图如下:(参考https://www.cnblogs.com/cxxjohnson/p/8909578.html)

Spark学习(1)-架构原理
文章图片
Standalone模式架构.png
该模式中有Master节点,slave节点,worker节点,其中Driver既可以运行在Master节点上也可以运行在本地客户端,如果通过spark-shell提交job,则Diver运行在master节点上,如果通过spark-submit提交job或者在Eclips、IDEA等开发平台上使用”new SparkConf.setManager(“spark://master:7077”)”方式运行Spark任务时,Driver是运行在本地Client端上的;
具体运行过程如下:

Spark学习(1)-架构原理
文章图片
Standalone.png
运行说明如下:
    1. Client运行Application的Driver,创建SparkContext,SparkContext会注册到Master上,并向Master申请cpu,memory资源;
    1. Master根据SparkContext申请的资源信息和通过心跳获取的Worker节点信息,选择一个Worker节点获取相应的资源,同时在该节点上启动StandaloneExecutorBackend进程;
    1. StandaloneExecutorBackend向SparkContext注册;
    1. SparkContext会将Application程序发送给StandaloneExecutorBackend,同时解析Application代码,获取DAG有向无环图,然后将DAG交给DAGScheduler构建成Stages(每当Action动作时,就会催生Job,每个Job可以包含多个Stage,每个Stage会有多个Task,Stage会在获取外部数据和shuffle之前产生),之后DAGScheduler会将Stage交给TaskScheduler,TaskScheduler会根据Worker节点资源剩余情况向Worker分配相应的任务,最后提交给StandaloneExecutorBackend进行执行;
  • 5.StandaloneExecutorBackend进程会根据Application程序创建一个Executor线程池,来执行每个任务,同时会将任务执行情况发送给SparkContext;
  • 6.SparkContext监听到最后一个Task完成时,向Master注销,并释放所有资源;
yarn-client模式
Spark on yarn运行模式根据Driver运行位置可以分为:yarn-client模式和yarn-cluster模式(也就是Yarn-standalone模式)
其yarn-client模式是因为Driver运行在本地,所以client可以和Spark Application进行交互,通过WebUI进行访问;
yarn-client运行过程图如下:

Spark学习(1)-架构原理
文章图片
Yarn-client.png 过程说明如下:
    1. Spark Yarn Client运行Application的Driver程序创建SparkContext,SparkContext会向Yarn ResourceManager申请运行AppMaster节点,同时会初始化DAGScheduler和TaskScheduler,由于是yarn-client模式,所以会选择YarnClientClusterScheduler和YarnClientClusterBackend;
    1. ResourceManager在收到请求后,会找到一个NodeManager,为该Application运行一个Container作为ApplicationMaster,该ApplicationMaster不运行SparkContext,但会和client保持联系进行资源分配;
    1. SparkContext在初始化完成后,会和ApplicationMaster通信,ApplicationMaster会根据任务信息向ResourceManager申请资源;
    1. ApplicationMaster申请到资源后,会联系指定的NodeManager,要求在分配的container中启动CoarseGrainedExecutorBackend进程,该进程启动后会向Client注册并申请task;
    1. Client中的SparkContext会根据CoarseGrainedExecutorBackend的资源信息然后分配相应的task,CoarseGrainedExecutorBackend在执行task时会向Driver汇报任务执行情况,这样Client可以根据任务执行情况决定是否重启任务;
  • 6.SparkContext在执行完最后一个任务后,会向ResourceManager注销并释放掉所有资源;
Yarn-cluster模式
客户端通过向Yarn cluster提交应用程序的方式来执行数据处理,那么Yarn会将该Application作为两个步骤来完成:
  • 1.第一个步骤是把Application的Driver程序当做ApplicationMaster来在集群中运行;
  • 2.第二个步骤是ApplicationMaster创建SparkContext,并向ResourceManager申请Executor资源,然后在申请到的资源上执行任务,并监控任务执行情况直到任务结束;
其具体执行流程如下图:

Spark学习(1)-架构原理
文章图片
Yarn-cluster.png 流程说明如下:
  • 1.Client会向ResourceManager提交Application申请;
  • 2.ResourceManager在收到Application申请后,会找到一个NodeManager,该NodeManager会分配一个Container作为ApplicationMaster,用来执行Driver程序,创建SparkContext,并初始化DAGScheduler和TaskScheduler,因为运行模式是Yarn-cluster,所以程序会选择YarnClusterScheduler来包装TaskScheduler;
    1. ApplicationMaster在SparkContext初始化后,会向ResourceManager申请资源来执行任务;
  • 4.ResourceManager会根据任务信息分配一个或者多个NodeManager,ApplicationMaster在得到分配资源后,会和NodeManager建立联系,要求其启动CoarseGrainedExecutorBackend进程; CoarseGrainedExecutorBackend进程启动后会向ApplicationMaster中的SparkContext注册并申请Task,这一点和standalone模式很像,只是SparkContext会在SparkApplication初始化时使用CoarseGrainedExecutorBackend配合YarnClusterScheduler来进行任务调度;
  • 5.SparkContext会根据CoarseGrainedExecutionBackend资源信息分配相应的任务,同时会监控CoarseGrainedExecutionBackend任务执行情况知道结束;
  • 6.ApplicationMaster会在所有任务都完成的情况下,向ResourceManager注销掉自己并释放所有资源;
【Spark学习(1)-架构原理】Yarn-client和Yarn-cluster模式区别:
Yarn-client和Yarn-cluster模式最大区别在于是否有ApplicationMaster运行Driver,在Yarn-client中由Client运行Driver,而ApplicationMaster主要用来向ResourceManager申请Containers来作Executor,之后由Client和相应的Executor所在Container进行通信,这样用户可以直接查看程序进行情况,比较适合交互式任务执行;
而在Yarn-cluster中,Driver是运行在ApplicationMaster中,ApplicationMaster不仅要和ResourceManager保持联系,并申请资源,同时还需要和containers保持联系,并下发任务和监视任务执行情况;

    推荐阅读