NightPxy 个人技术博客

Spark-架构

Posted on By NightPxy

Spark的集群模式

Spark执行流程

Spark在集群中运行多个进程,这些进程通过driver(SparkContext运行的main方法进程)进行协调

  • 启动SparkContext所在的main方法进程,这个进程将作为driver端负责协调整个应用程序
  • driver端启动后,会根据设置的需求的资源(内存和核),向集群管理器申请所需资源
  • 集群管理器会在集群中搜集所需的资源,搜集完毕后会将资源锁定并将资源所在节点机地址交给driver
  • driver会联系节点机,将执行任务的jar以及相关资源传给节点机(executor),并启动执行
  • 在执行过程中,executor和driver将反复通讯,executor心跳处理情况,driver协调重启

一些重要点

1.每个应用程序进程属于它自己,这些进程会在整个应用程序一直存活(等待执行或正在执行)

  • 好处 应用程序执行隔离(不同的JVM) 和 集群资源隔离(不同的Container).
  • 坏处 两个应用程序之间无法数据交换.这时可以利用外部数据存储
  • 必须注意SparkContext.stop,否则将无法释放集群资源

2.Spark不关心它使用在哪种集群管理器中

  • Spark只关心driver和executors能互相通讯就行了

3.driver在executors生命周期中保持监听

集群调度器

Spark虽然支持Standalone,YARN,Mesos和k8s等需要种集群调度器,但目前的主流依然是YARN模式
在YARN模式,Spark将完全退化成客户端的形式.即Spark无需部署成集群
集群任务的提交,将完全依赖提交到Spark环境到集群中,通过在YARN-Container中构建出Spark来执行

所以在Spark On YARN 必须将Spark环境(jar和conf)提交到HDFS中
PS:这一步严格来说可以省略,但是,如果没有预提交,就会在每个任务执行时自动单独打包Spark到集群中,这会极大的延长(3-5秒左右,注意是每个任务延迟3-5秒)作业申请时间,所以必须配置

# jars 打包
zip -rj /home/hadoop/app/spark-2.3.1-bin-2.6.0-cdh5.7.0/spark-2.3.1-bin-2.6.0-cdh5.7.0-jars.zip /home/hadoop/app/spark-2.3.1-bin-2.6.0-cdh5.7.0/jars/*

# Spark HDFS Path
hadoop fs -mkdir -p hdfs://hadoop000:9000/spark/spark-2.3.1-bin-2.6.0-cdh5.7.0

# jars 拷贝进 Spark HDFS Path
hadoop fs -put /home/hadoop/app/spark-2.3.1-bin-2.6.0-cdh5.7.0/spark-2.3.1-bin-2.6.0-cdh5.7.0-jars.zip  hdfs://hadoop000:9000/spark/spark-2.3.1-bin-2.6.0-cdh5.7.0

# 检查
hadoop fs -ls hdfs://hadoop000:9000/spark/spark-2.3.1-bin-2.6.0-cdh5.7.0/

# 加入默认配置

spark.yarn.archive      hdfs://hadoop000:9000/spark/spark-2.3.1-bin-2.6.0-cdh5.7.0/spark-2.3.1-bin-2.6.0-cdh5.7.0-jars.zip

Spark中的术语

Application

用户的整个程序,包括所有的driver和executors

Application jar

用户提交Spark执行的,包括程序执行代码以及依赖资源的Jar包

Driver program

SparkContext所在main方法的执行进程
driver负责向集群管理器申请资源,发送执行代码和相关环境到executor,调度executor执行等

Cluster manager

集群管理器,这对Spark来说是一个外部概念,简单来说就是Spark所运行在的集群的资源管理器是什么 .比如YARN,Standalone,Mesos等等

Deploy mode

driver的执行模式.
Spark的driver有两种执行模式 client 和 cluster

  • cluster
    driver执行在集群内部.即由集群管理器随机挑选一个Container作为driver端的承载
  • client 模式
    driver执行在集群之外,即在提交任务的客户机上启动一个进程作为driver端的承载

Worker node

Executor所在的集群节点

Executor

在工作节点上运行的进程.负责运行任务线程和存储任务数据.

Task

发送给每一个executor去执行的一个工作单元

Job

在Task之上运行的Spark Action产生的任务,包含Action,已经Action之前的Transform的执行单元

Stage

这是Spark的内部执行单元.
每个Job最终都分为一个或多个Stage来最终执行

Deploy mode对比

client 的优势和劣势都是 driver端是我们可以预测和定义.而cluster模式,因为driver是在集群之内,所以是由集群管理器随机挑选一个作为driver端

  • client模式单点问题
    因为大量driver端都集中在某一台机器上(提交任务的那台),如果该机器出现问题,很容易造成大面积的Spark任务失败.因为executors必须随时与driver保持通讯,即driver必须存活
  • client模式可能出现网络瓶颈
    因为executors必须随时与driver保持通讯,即该台机器必须于大量的executor节点进行网络传输,集中在集群之外的某一台,可能会造成该台机器的网络瓶颈
  • clinet模式的执行日志始终在指定机器,而不是随机节点
    这可能是client模式的唯一好处了