119、Spark核心编程进阶之集群架构

这里以yarn-cluster集群架构进行举例
spark程序写完了以后,就要提交到spark集群上面去运行,这就是spark作业(一次代码的运行+一份数据的处理+一次结果的产出)
spark作业是通过spark集群中的多个独立的进程来并行运行的,每个进程都处理一部分数据,从而做到分布式并行计算,才能对大数据进行处理和计算
作业在多个进程中的运行,是通过SparkContext对象来居中调度的,该对象是在咱们的driver进程中的(包含main方法的程序进程)
SparkContext是支持连接多种集群管理器的(包括Spark Standalone、YARN、Mesos)
集群管理器是负责为SparkContext代表的spark application,在集群中分配资源的
这里说的资源是什么?通俗一点,就是分配多个进程,然后每个进程不都有一些cpu core和内存,有了进程、cpu和内存,你的spark作业才能运行啊
SparkContext会要求集群管理器来分配资源,然后集群管理器就会集群节点上,分配一个或多个executor进程
这些进程就会负责运行你自己写的spark作业代码,每个进程处理一部分数据
具体是怎么运行我们的代码的呢?申请到了executor进程之后,SparkContext会发送我们的工程jar包到executor上,这样,executor就有可以执行的代码了
接着SparkContext会将一些task分发到executor上,每个task执行具体的代码,并处理一小片数据
此外要注意的一点是,executor进程,会会负责存储你的spark作业代码计算出来的一些中间数据,或者是最终结果数据


119、Spark核心编程进阶之集群架构
基于yarn-cluster提交模式深度剖析.png

看着上面的图,再详细说说

第一步,我们写了一段程序,spark代码,里面肯定是有main方法的,比如说是java/scala,我们去运行这个代码,代码一旦跑起来,一定是运行在一个进程里面的
进程会去执行main方法中的代码
进程,程序跑起来的进程,通常来说就是jvm进程,java虚拟机进程,就是我们的driver进程,也就是driver,也可以叫Driver Program
executor进程会运行在多个节点上面
在某一个节点会运行我们的driver进程
sparkcontext,就是我们自己在代码里创建的,负责调度我们的整个spark作业的运行

第二步,spark集群管理器,目前来说,支持的有Spark Standalone、YARN、Mesos,常用的,也就只有Spark Standalone和YARN
SparkContext,会跟集群管理器去申请资源,申请启动一些executor进程
集群管理器主要就负责在各个节点上,给spark作业启动一批executor进程

第三步,启动executor进程

第四步,driver会将我们的工程jar发送到所有的executor进程中,这样呢,每个进程,就都有了可以执行的,我们写的spark代码
我们自己写的spark项目,一定是一个spark工程,比如说eclipse中的java工程,maven构建
要提交作业,肯定要把工程打包成一个jar包

第五步,其实driver,sparkcontext对象,会根据我们写的spark代码,创建一批一批的task,最小计算单元;比如说,1000个task,100个executor进程,会将task分发到executor进程中去执行;每个executor进程执行10个task
每个task,都会执行本地jar包中的相同的一段代码,但是,每个task处理不同的数据
比如说,对于hdfs文件,每个task处理一个hdfs block,hdfs block会对应,rdd的一个partition,一个task就处理一个partition
就做到了大量task并行执行,每个task就处理一小片数据,速度很快

关于spark集群架构的一些说明

  1. 每个spark application,都有属于自己的executor进程;绝对不可能出现多个spark application共享一个executor进程的
    executor进程,在整个spark application运行的生命周期内,都会一直存在,不会自己消失的
    executor进程,最主要的,就是使用多线程的方式,运行SparkContext分配过来的task,来一批task就执行一批,一批执行完了,再换下一批task执行
  2. spark application,跟集群管理器之间,是透明的
    不管你是哪个集群管理器,我就知道,我找你就可以申请到executor进程就好了
    所以说,就算在一个能够容纳其他类型的计算作业的集群管理器中,也可以提交spark作业,比如说YARN、Mesos这种
    一般都是用YARN作为大数据计算作业管理器的,包括mapreduce、hive、storm和spark,统一在yarn上面运行,统一调度和管理系统资源
  3. driver(其实也就是咱们的main类运行的jvm进程),必须时刻监听着属于它这个spark application的executor进程发来的通信和连接
    而且driver除了监听,自己也得负责调度整个spark作业(你自己写的spark代码)的调度和运行,也得大量跟executor进程通信,给他们分派计算任务
    所以driver在网络环境中的位置,还是很重要的,driver尽量离spark集群得近一些
  4. 上面说了,driver要调度task给executor执行,所以driver最好和spark集群在一片网络内