在集群上运行sparkspark的运行架构驱动器节点和所有的执行器节点一起被称为一个Spark应用(application)当启动spa rk-shell就相当于启动了Driver。这就是为什么它自动提供了sc对象。驱动器节点Driver驱动器节点的两大职责:把用户程 序转化为任务:(创建task)任务是Spark中最小的工作单元,用户程序通常要启动成百上千的独立任务为执行器节点调度任务:(分 配task)任务是Spark中最小的工作单元,用户程序通常要启动成百上千的独立任务。当任务执行时,执行器进程会把缓存数据存储起 来,而驱动器进程同样会跟踪这些缓存数据的位置,并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输。驱动器程序会将一些 Spark应用的运行时的信息通过网页界面呈现出来,默认在端口4040上。执行器节点Executor执行器节点的两大功能它们负 责运行组成Spark应用的任务,并将结果返回给驱动器进程;就是运行task任务它们通过自身的块管理器(BlockManage r)为用户程序中要求缓存的RDD提供内存式存储。就是cache()本地模式中驱动器程序和执行程序Spark驱动器程序和各执行 器程序在同一个Java进程中运行。这是一个特例;执行器程序通常都运行在专用的进程中。集群管理器节点Spark依赖于集群管理器 来启动执行器节点,而在某些特殊情况下,也依赖集群管理器来启动驱动器节点。standalone类型:管理资源的主节点------ma sterMesos类型:管理资源的主节点------MesosMasterhadoopyarn类型:管理资源的主节点------- ---ResourceManager注:驱动器和执行器是用来描述执行spark程序的。集群管理器包含的是主从节点使用spark- submit部署应用Spark提交程序脚本组成对于不同的集群管理方式,其提交脚本不同,这个可以通过官网查询具体是什么。但各个选项的 含义是一样的。(1)提交脚本样例例一:例二:例三:(2)提交脚本常见选项六、集群管理器的选择选择合适的集群管理器Spark所支 持的各种集群管理器为我们提供了部署应用的多种选择。如果你需要从零开始部署,正在权衡各种集群管理器,我们推荐如下一些准则。?如果是 从零开始,可以先选择独立集群管理器。独立模式安装起来最简单,而且如果你只是使用Spark的话,独立集群管理器提供与其他集群管理 器完全一样的全部功能。?如果你要在使用Spark的同时使用其他应用,或者是要用到更丰富的资源调度功能(例如队列),那么YA RN和Mesos都能满足你的需求。而在这两者中,对于大多数Hadoop发行版来说,一般YARN已经预装好了。?Mes os相对于YARN和独立模式的一大优点在于其细粒度共享的选项,该选项可以将类似Sparkshell这样的交互式应用中的 不同命令分配到不同的CPU上。因此这对于多用户同时运行交互式shell的用例更有用处。在集群上运行Spark|121? 在任何时候,最好把Spark运行在运行HDFS的节点上,这样能快速访问存储。你可以自行在同样的节点上安装Mesos或 独立集群管理器。如果使用YARN的话,大多数发行版已经把YARN和HDFS安装在了一起七、spark工作流程用户提交程 序出发driver向master主节点进行请求注册Master接收到请求后,进行资源调度,目的是让worker启动executor 。Executor启动后会再向driver发送反向注册,目的是告知有哪些executor能够工作Driver接收到这个信息后,就会 使程序继续向下执行,运行过程就会对这些RDD有一些算子操作。Spark会把这些代码封装成为一个一个task任务。这些task任务才 是我们真正要执行的任务。Spark将这些task再次发送到相应的executor中去执行过程:(1)挑一台主机向上面提交sprak 任务(2)使用Spark-submit去提交代码,同时启动driver(3)启动了Driver也就意味着main里面的代码开始要运 行了。首先重点运行的是、Varsc=newSparkContext();这句代码初始化的时候重点创建如下两个东西DA GScheduler,TaskScheduler(4)TaskScheduler会向Master进行注册,Master接收到请求 后,会向Worker进行资源调度,进而启动Worker中的Executor(5)Worker给Application启动Exec utor(6)Executor启动完了以后,会向Driver进行反向注册,这样应用程序就知道那些Worker上面的那些Execu tor为自己的这个任务进行服务了。接下来Spark代码就接着往下执行,每遇到一个action类型的算子就新建一个job任务,会把创 建的这个job任务提交给DAGScheduler.DAGScheduler会把这个job任务划分成多个stage,并会为每个st age创建一个TaskSet集合(7)DAGScheduler会把生成的TaskSet提交给TaskSchedule(8)Task Scheduler会把TaskSet集合里面的每个task对象发送给Executor。。Executor接受到task,都会启动 一个TaskRunner去封装这个task,把task丢到线程池里面去运行。八、Rdd中的stage、job、task、分区注:1 .由action类型算子触发生job---stage--task2.一个stage里面有多个task,同一个stage里面的t ask的计算逻辑是一样的,只是数据不一样。3.我们封装出来的task有两种类型:最后一个stage里面的task统一都叫做Res ultTask其余所有的stage里面的task都叫ShuffleMapTask4.DAGScheudler主要将job划分成stage并生成task集合,面向stage进行任务的调度(stage的划分算法)TaskScheduler主要进行的是task的发送,面向task进行调度一个分区里面可以有多个task,但一个task只能位于一个分区中。 |
|