大数据
流式处理
Spark

Spark基础 04 - Spark架构简介

简介:本文简单介绍了Spark的基础架构以及相关的Spark参数配置及命令

1. Spark内核架构

1.Spark内核架构.png

2. 宽依赖和窄依赖

窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应常数个父RDD分区(O(1),与数据规模无关)

相应的,宽依赖是指父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区(O(n),与数据规模有关)

3. 基于Yarn的两种提交模式

  • Yarn-Cluster提交模式

spark-submit提交到Yarn-Cluster之后,会发送请求到ResourceManager,请求启动ApplicationMaster,ResourceManager会分配Container,在某个NodeManager上,启动ApplicationMaster(相当于Driver),ApplicationMaster请求Container启动Executor,ResourceManager会分配一批Container,用于启动Executor,然后反向注册到ApplicationMaster,ApplicationMaster连接其他NodeManager,启动Executor,这里的NodeManager相当于Worker。

Yarn-Cluster用于生产环境,因为Driver运行在Nodemanager,没有网卡流量激增的问题,缺点在于,调试不方便,本地用spark-submit提交后,看不到log,只能通过yarn application -logs application_id这种命令来查看,比较麻烦。

  • Yarn-Client提交模式

spark-submit提交之后,在本地启动一个Driver进程,然后发送到 ResourceManager,请求启动ApplicationManager, ResourceManager就会分配一个Container,在某个Nodemanager上启动ExecutorLanucher(ApplicationMaster),ResourceManager会申请Container,启动Executor,然后ApplicationManager会连接其他NodeManager,用Container的资源启动Executor。

Yarn-Client用于测试,因为Driver运行在本地客户端,负责调度Application,会与Yarn集群产生超大量的网络通信,从而导致网卡流量激增,可能会被公司的SA(运维)给警告,好处在于直接执行,本地可以看到所有的log,方便调试。

Yarn-Client和Yarn-Cluster两种模式的示意图如下:

2.基于Yarn的两种提交模式.png

  • Standalone和Yarn-Client类似,也会在本地启动Driver程序,可以在本地查看log。

具体这三种提交方式如何使用?

  • 如果使用的是原生Spark集群,没有使用Yarn,那么就使用Standalone模式,建议搭建多个节点提交应用,要不然会对单节点造成很大的压力。
  • 如果使用的是Spark on Yarn,那么测试的时候使用Yarn-Client模式,实际生产环境的时候使用Yarn-Cluster模式。

注:使用--master的方式提交到Yarn集群上时,可能需要在spark-env.sh中添加Hadoop的Home环境变量。

4. SparkContext原理解析

3.SparkContext原理解析.png

5. 主备切换

在Spark中,Master其实可以配置两个,即Spark原生的Standalone模式是支持Master主备切换的。也就是说,当Active Master节点宕机的时候,可以将StandBy Master切换为Active Master。

Spark Master主备切换可以基于两种机制,一种是基于文件系统的,一种是基于Zookeeper的;基于文件系统的主备切换机制,需要在Active Master宕机之后,由我们手动切换到StandBy Master上,而基于Zookeeper的主备切换机制可以实现自动切换Master。

下图展示了Master主备切换的时候,Active到StandBy切换时Master会做哪些操作:

4.Master主备切换机制原理.png

6. Worker、Driver及Application的注册

5.Worker、Driver及Application的注册机制原理.png

7. Woker原理

6.Worker原理.png

8. Stage划分算法

7.Stage划分算法.png

9. 部署细节以及相关参数详解

9.1. 配置的Worker节点

  1. 首先,如果想将某台机器部署成Standalone集群架构中的Worker节点(会运行Worker Daemon进程),就必须在那台机器上部署的Spark安装包。
  2. 配置conf/slaves文件,在conf/salves文件中,可以配置在哪些机器上启动Worker进程;默认情况下没有conf/slaves这个文件,只有一个conf/slaves.template,而且该文件全部配置都被注释了,因此默认只在当前主节点上启动一个Master进程和一个Worker进程,此时Master进程和Worker进程在一个节点上,也即是伪分布式部署
  3. 配置集群时,需要将将slaves.template拷贝为一份slaves文件,然后进行编辑;此时在conf/slaves文件中可以添加要作为Worker节点的机器,一行配置代表一台机器;配置以后,在这些节点上都需要部署Spark安装包,且需要有相同的conf/slaves文件。Master和Worker机器之间的访问时通过SSH方式进行的,所以需要配置多个机器之间的SSH免密码登录。

9.2. conf/spark-env.sh文件

spark-env.sh文件是Spark中最核心的一份配置文件,可以对整个Spark的集群部署,各个Master和Worker进程的相应的行为进行充分和细节化的配置。

  1. 首先是Master相关的配置,有以下几项:
  • SPARK_MASTER_IP:指定Master进程所在的机器的IP地址。
  • SPARK_MASTER_PORT:指定Master监听的端口号(默认是7077)。
  • SPARK_MASTER_WEBUI_PORT:指定Master Web UI的端口号(默认是8080)。

这些配置在当遇到需要临时更改的情况,还可以通过传递参数给sbin/start-master.sh脚本来设置,会覆盖spark-env.sh文件中的配置。

  1. SPARK_MASTER_OPTS可以设置Master的额外参数,使用-Dx=y来设置,如export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=1";主要有以下几项:
参数名 默认值 含义
spark.deploy.retainedApplications 200 在Spark Web UI上最多显示多少个Application的信息
spark.deploy.retainedDrivers 200 在Spark Web UI上最多显示多少个Driver的信息
spark.deploy.spreadOut true 资源调度策略,开启spreadOut会尽量将Application的Executor进程分布在更多Worker上,适合基于HDFS文件计算的情况,提升数据本地化概率;而非spreadOut会尽量将Executor分配到一个Worker上,适合计算密集型的作业
spark.deploy.defaultCores 无限大 每个Spark作业最多在Standalone集群中使用多少个CPU Core,默认是无限大,有多少用多少
spark.deploy.timeout 60 单位秒,一个Worker多少时间没有响应之后,Master认为Worker挂掉了
  1. SPARK_LOCAL_DIRS:Spark的工作目录,存储Shuffle Map输出文件,以及持久化到磁盘的RDD等。
  2. Worker相关的配置,有以下几项:
  • SPARK_WORKER_PORT:Worker节点的端口号,默认是随机的。
  • SPARK_WORKER_WEBUI_PORT:Worker节点的Web UI端口号,默认是8081。
  • SPARK_WORKER_CORES:Worker节点上,允许Spark作业使用的最大CPU数量,默认是机器上所有的CPU Core。
  • SPARK_WORKER_MEMORY:Worker节点上,允许Spark作业使用的最大内存量,格式为1000m,2g等,默认最小是1g内存。
  • SPARK_WORKER_INSTANCES:当前机器上的Worker进程数量,默认是1,可以设置成多个,但是这时一定要设置SPARK_WORKER_CORES,限制每个Worker的CPU数量。
  • SPARK_WORKER_DIR:Spark作业的工作目录,包括了作业的日志等,默认是spark_home/work。
  1. SPARK_WORKER_OPTS可以设置Worker的额外参数,使用-Dx=y设置;主要有以下几项:
参数名 默认值 含义
spark.worker.cleanup.enabled false 是否启动自动清理Worker工作目录,默认是false
spark.worker.cleanup.interval 1800 单位秒,自动清理的时间间隔,默认是30分钟
spark.worker.cleanup.appDataTtl 7 * 24 * 3600 默认将一个Spark作业的文件在Worker工作目录保留多少时间,默认是7天
  1. 其他配置:
参数名 含义
SPARK_DAEMON_MEMORY 分配给Master和Worker进程自己本身的内存,默认是1g
SPARK_DAEMON_JAVA_OPTS 设置Master和Worker自己的JVM参数,使用-Dx=y设置各个参数
SPARK_PUBLISC_DNS Master和Worker的公共DNS域名,默认是没有的

10. 默认的配置属性

spark-submit脚本会自动加载$SPARK_HOME/conf/spark-defaults.conf文件中的配置属性,并传递给我们的Spark应用程序;使用这种方式可以避免在spark-submit脚本中设置所有的属性,比如,默认属性中有一个spark.master属性,通过spark-defaults.conf文件配置后,在spark-submit脚本中就可以忽略--master参数。

另外也可以通过SparkConf来设置这些参数,如SparkConf.getOrElse("spark.master", "local")

以将spark.default.parallelism值配置为100例,这三种方式的配置如下:

  • SparkConf方式:SparkConf.set("spark.default.parallelism", "100")
  • spark-submit方式:--conf spark.default.parallelism=100
  • spark-defaults.conf文件方式:spark.default.parallelism 100

这三种配置的优先级为:SparkConf > spark-submit > spark-defaults.conf

主:如果想要了解更多关于配置属性的信息,可以在spark-submit脚本中,使用--verbose,打印详细的调试信息。

11. Spark所有Shell脚本

参数名 含义
sbin/start-all.sh 根据配置,在集群中各个节点上,启动一个Master进程和多个Master进程
sbin/stop-all.sh 在集群中停止所有Master和Master进程
sbin/start-master.sh 在本地启动一个Master进程
sbin/stop-master.sh 关闭Master进程
sbin/start-slaves.sh 根据conf/slaves文件中配置的Worker节点,启动所有的Worker进程
sbin/stop-slaves.sh 关闭所有Worker进程
sbin/start-slave.sh 在本地启动一个Worker进程