Spark(二)

理解Spark集群架构

无论是使用单机运行Spark,还是使用成百上千台机器组成额集群,Spark应用里始终存在几个组件.
Spark应用组件包括:驱动器(driver)、主进程(master)、集群管理器(cluster manager)以及至少一个执行器(executor)[存在于工作节点(worker)].

包括驱动器进程、主进程和至少一个执行器进程在内的所有Spark组件都运行在java虚拟机(JVM)上.JVM是跨平台的运行环境引擎,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Spark使用Scala实现的,而Scala语言会编译为字节码而运行在JVM上

Spark的运行时应用组件与这些组件所运行的位置和节点类型之间的区别是有必要特别注意的.
当使用不同的部署模式时,这些组件运行的位置也不一样.

Spark驱动器

Spark应用生命周期的开始和结束与Spark驱动器的保持一致.驱动器是Spark客户端用来提交应用的进程。驱动器进程也负责规划和协调Spark程序的执行,并向客户端返回执行状态以及结果数据.后面会介绍,驱动器进程可以运行在客户端,也可以运行在集群里的一个节点上

  1. SparkSession
    Spark驱动器进程负责创建SparkSession对象.SparkSession对象代表Spark集群的一个连接.SparkSession在Spark应用启动的时候实例化出来,并在程序整个运行过程中使用,包括交互式shell程序也是这样.
    在Spark2.0之前,Spark的应用的入口有这么几个:Spark core应用使用SparkContext,Spark SQL应用使用SQLContext和HiveContext,Spark Streaming应用使用StreamingContext.而Spark 2.0引入的SparkSession对象把这些对象组合到了一起,成为所有Spark程序统一的入口.
    SparkSession对象中包含运行时用户配置的所有参数属性,包括Spark主程序、应用名称、执行器数等.这些参数属性在SparkSession对象内的SparkContext和SparkConf子对象中
1
2
3
4
5
from pyspark.sql import SparkSession
spark=SparkSession.builder.master("spark://sparkmaster:7077").appName("My Spark Application") \
.config("Spark.submit.deployMode","client") \
.count()
print("The total number of lines is "+str(numlines))
  1. 应用规划
    驱动器的主要功能之一就是确定应用执行计划.驱动器接收应用处理作业作为输入,规划程序的执行计划.驱动器进程根据所有要执行的转换操作(transformation,对数据进行操作)和行动操作(action,请求输出数据或提示程序实际执行的操作)创建出由节点(node)组成的有向无环图(DAG),其中每个节点表示一个转化或者计算的步骤.
    一个Spark应用的DAG由任务和阶段组成.任务是Spark程序最小的可调度单元。阶段是一组可以并发执行的任务的总称.阶段间存在依赖依赖关系,即阶段依赖.
    就进程调度而言,DAG不是Spark所独有的,其他一些大数据生态圈的项目也在调度中使用DAG.DAG对于Spark来说至关重要,因此要把DAG的概念烂熟于心.

  2. 应用协调
    驱动器进程也负责协调DAG内定义的个阶段各任务的运行.在任务的调度和执行中,驱动器进程做的主要的事情包括下列两项:

  • 维护执行任务时可用的资源的记录
  • 把任务尽量调度到”靠近”数据的地方(数据本地化的概念)
  1. 其他功能
    驱动器还负责返回应用的执行结果.这个结果可以是一个返回码,当行动操作要求把实际数据返回到客户端时,也可以是实际数据(比如在交互式查询的场景里)

    Spark工作节点与执行器

    Spark执行器是运行在Spark的DAG中的任务的进程。执行器会占用Spark集群的从节点(工作节点)上的CPU和内存资源.每个执行器都是特定的Spark应用专用的,当应用完成时退出.一个Spark程序通常有多个执行器并行工作。
    执行器运行在工作节点,而每个工作节点在同一时间内能启动的执行器数量是有限的/额定的.因此,对于一个规模固定的集群来说,同一时间能启动的执行器数量也是有限的.如果一个应用请求了超过集群剩余物理容量的执行器数量,就需要等待已启动的执行器完成并释放资源.
    Spark执行器运行在JVM上,每个执行器所使用的JVM都有一个堆(heap),是用来存储和管理对象的专用的内存空间.

    Spark主进程与集群管理器

    Spark驱动器进程对运行Spark应用所需的任务集进行规划和协调.任务本身则在执行器中运行,而执行器运行在工作节点上.
    执行器利用分布式集群的资源运行,在YARN或者Mesos模式下,这些运行执行器的资源称为容器.主进程与集群管理器是对分布式集群的资源进行监控、占用以及分配的核心进程。主进程和集群管理器可以是分开的进程,有时也可以合在一个进程里,比如以独立集群模式运行Spark时.
  2. Spark主进程
    Spark主进程是向集群申请资源,并把资源交给Spark驱动器的进程.在各种部署模式中,主进程都向工作节点(从节点)请求资源(容器),并跟踪它们的状态,监控执行进度.
    当以独立集群模式运行Spark时,Spark主进程在主节点的8080端口上提供了一个网页版的用户界面.
  3. 集群管理器
    集群管理器是负责监控工作节点并在主进程请求时在工作节点上预留资源,然后主进程就把这些集群资源以执行器的形式交给驱动器进程使用.
    如上所述,集群管理器可以独立于主进程.在Mesos或者YARN上运行Spark就是这样的.如果以独立集群模式运行Spark,那么主进程也会提供集群管理器的功能.实际上就是主进程充当了自己的集群管理器.

总结:

Spark驱动器功能:1.创建SparkSession,启动Spark应用 2.规划3.协调4.返回结果
Spark工作节点和执行器:执行器运行DAG上任务的进程,一个工作节点上有多个执行器,因此执行器会占用工作节点上的CPU和内存资源
Spark主进程:注意Spark主进程与Spark驱动器的区别,Spark主进程主要是对集群申请资源,并把资源交给Spark驱动器的进程
集群管理器:像是Spark集群的发言人,与Spark主进程对接,当主进程请求时,集群管理器为它们预留资源.

-------------本文结束感谢您的阅读-------------