Spark运行架构以及容错机制

Spark运行架构以及容错机制

  • 1. Spark的角色区分
    • 1.1 Driver
    • 1.2 Excuter
  • 2. Spark-Cluster模式的任务提交流程
    • 2.1 Spark On Yarn的任务提交流程
      • 2.1.1 yarn相关概念
      • 2.1.2 任务提交流程
    • 2.2 Spark On K8S的任务提交流程
      • 2.2.1 k8s相关概念
      • 2.2.2 任务提交流程
  • 3. Spark-Cluster模式的容灾模式
    • 3.1 Driver容灾
    • 3.2 Executor容灾
    • 3.3 RDD容错
  • 4. 疑问和思考
    • 4.1 是否可以部署多个Driver,形成HA模式,如果主Driver宕机,备Driver自动接替?
  • 5. 参考文档

spark是一个开发框架,用于进行数据批处理,本文主要探讨Spark任务运行的的架构。由于在日常生产环境中,常用的是spark on yarn 和spark on k8s两种类型的模式,因此本文也主要探讨这两种类型的异同,以及不同角色的容错机制。


1. Spark的角色区分

1.1 Driver

Spark的驱动器节点,负责运行Spark程序中的main方法,执行实际的代码。Driver在Spark作业时主要负责:

  • 将用户程序转化为作业(job)
  • 负责跟RM(yarn)或者 Apiserver(k8s)申请资源,调度并拉起Excutor,协调和分配Executor之间的任务(task)
  • 监控Executor的执行状态
  • 通过UI展示运行情况。

1.2 Excuter

Executor是Spark程序中的一个JVM进程,负责执行Spark作业的具体任务(task),每个任务之间彼此相互独立。Spark应用启动时,Executor同时被启动,并且伴随着Spark程序的生命周期而存在。如果有Executor节点发生了故障,程序也不会停止运行,而是将出错的Executor节点上的任务调度到其他Executor节点运行。

Executor的核心功能:

  • 运行Spark作业中具体的任务,并且将执行结果返回给Driver。
  • 通过自身的块管理器(Block Manager)对用户要求缓存的RDD进行内存式存储。RDD式缓存在Executor进程内部的,这样任务在运行时可以充分利用缓存数据加速运算。

2. Spark-Cluster模式的任务提交流程

2.1 Spark On Yarn的任务提交流程

2.1.1 yarn相关概念

RM(ResourceManager):

即资源管理,在YARN中,RM负责集群中所有资源的统一管理和分配,它接收来自各个节点(NM)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是AM)

NM(NodeManager):
NM是运行在单个节点上的代理,它需要与应用程序的AM和集群管理者RM交互:

  • 从AM上接收有关Container的命令并执行之(比如启动、停止Container);
  • 向RM汇报各个Container运行状态和节点健康状况,并领取有关Container的命令(比如清理Container)执行之。

AM(ApplicationMaster):

用户提交的每个应用程序均包含一个AM,它可以运行在RM以外的机器上负责,主要负责

  • 与RM调度器协商以获取资源(用Container表示),将得到的任务进一步分配给内部的任务(资源的二次分配)。
  • 与NM通信以启动/停止任务。
  • 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

注:RM只负责监控AM,并在AM运行失败时候启动它。RM不负责AM内部任务的容错,任务的容错由AM完成。

在Yarn任务的启动流程中,

  • client优先跟RM获取NM资源并启动AM,在Cluster模式下,AM启动后client就可以退出了
  • AM构建任务信息,并RM获取NM资源并启动Executor,并将task信息分配给Executor从而实现任务启动
  • Executor需要跟AM进行心跳汇报,如果Executor异常,相关的拉起动作也是有AM来控制。

2.1.2 任务提交流程

Driver和AM是两个完全不同的东西,Driver是控制Spark计算和任务资源的,而AM是控制yarn app运行和任务资源的。在Spark On Yarn模式中,Driver运行在AM上,Driver会和AM通信,资源的申请由AppMaster来完成,而任务的调度和执行则由Driver完成,Driver会通过与AppMaster通信来让Executor的执行具体的任务。

任务提交流程图
在这里插入图片描述
执行过程

  1. Client向YARN中提交应⽤程序,包括AM程序、启动AM的命令、需要在Executor中运⾏的程序等
  2. RM收到请求后,在集群中选择⼀个NM,为该应⽤程序分配第⼀个Container,要求它在这个Container中启动应⽤程序的AM,进行SparkContext(Driver)等的初始化
  3. AM向RM注册,这样⽤户可以直接通过RM查看应⽤程序的运⾏状态,然后它将采⽤轮询的⽅式通过RPC协议为各个任务申请资源,并监控它们的运⾏状态直到运⾏结束
  4. ⼀旦AM申请到资源(也就是Container)后,便与对应的NM通信,要求它在获得的Container中启动Executor,Executor启动后会向 AM中的SparkContext(Driver)注册并申请Task。
  5. AM中的SparkContext(Driver)分配Task给Executor执⾏,运⾏Task并向AM中的SparkContext(Driver)的汇报运⾏的状态和进度,以让 AM中的SparkContext(Driver)随时掌握各个任务的运⾏状态,从⽽可以在任务失败时重新启动任务应⽤程序运⾏完成后,AM中的SparkContext(Driver)向NM申请注销并关闭⾃⼰
    6.应⽤程序运⾏完成后,AM向NM申请注销并关闭⾃⼰

YARN-Cluster的执行,需要安装spark 客户端,并执行如下命令提交任务

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn  --deploy-mode cluster \
--num-executors 1 \
/Users/ly/apps/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 10

在这里插入图片描述

2.2 Spark On K8S的任务提交流程

Spark 2.3开始,Spark官方就开始支持Kubernetes作为新的资源调度模式。

2.2.1 k8s相关概念

Master:
Kubernetes里的Master指的是集群控制节点,每一个Kubernetes集群里都必须要有一个Master节点来负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,它来负责具体的执行过程,我们后面执行的所有命令基本都是在Master节点上运行的

Node:
Node节点是Kubernetes集群中的工作负载节点,每个Node都会被Master分配一些应用程序服务以及云工作流。

2.2.2 任务提交流程

总体提交流程如下

在这里插入图片描述

可以通过spark原生提交方式spark-on-k8s-operator提交 两种方式进行提交,两种方式实现上有些差异,但是总体流程是一致的。

1, spark原生提交方式

需要安装spark 客户端,并执行如下命令提交任务

bin/spark-submit \
    --master k8s://https://{k8s-apiserver-host}:6443 \
    --deploy-mode cluster \
    --name spark-wordcount-example \
    --class org.apache.spark.examples.JavaWordCount \
    local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar \
    oss://{wordcount-file-oss-bucket}/

2, spark-on-k8s-operator提交

spark-on-k8s-operator[2],可以让用户以CRD(CustomResourceDefinition) [4] 的方式提交和管理Spark作业。这种方式能够更好的利用k8s原生的能力,具备更好的扩展性。并且在此之上增加了定时任务、重试、监控等一系列功能。具体的功能特性可以在github查看官方文档(kubernetes官方推荐)

需要
1, 需要提前在k8s集群中安装,此时会启动一个名为sparkoperator的pod
2,定义提交spark任务的相关CRD资源
3,提交作业时,无需准备一个具备Spark环境的Client,直接通过kubectl或者kubernetes api就可以提交Spark作业。

列入一个crd,命名spark.yaml

apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: spark-wordcount-example
  namespace: default
spec:
  type: Java
  sparkVersion: 2.4.5
  mainClass: org.apache.spark.examples.JavaWordCount
  image: {Spark镜像地址}
  mainApplicationFile: "local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar"
  arguments:
    - "oss://{wordcount-file-oss-bucket}/"
  driver:
    cores: 1
    coreLimit: 1000m
    memory: 4g
  executor:
    cores: 1
    coreLimit: 1000m
    memory: 4g
    memoryOverhead: 1g
    instances: 2

执行如下命令即可启动相关的pod,并进行提交任务

kubectl apply -f spark.yaml

在这里插入图片描述

3. Spark-Cluster模式的容灾模式

3.1 Driver容灾

Driver异常退出时,一般要使用checkpoint重启Driver,重新构造上下文并重启接收器。
第一步,恢复检查点记录的元数据块。
第二步,未完成作业的重新形成。由于失败而没有处理完成的RDD,将使用恢复的元数据重新生成RDD,然后运行后续的Job重新计算后恢复。

3.2 Executor容灾

Executor异常是日常生产环境中最常遇到的现象,造成的原因很多,最常见的是由于机器故障,从而导致就上运行的Executor异常。

Executor异常退出时,Driver没有在规定时间内收到执行器的状态更新,于是Driver会将注册的Executor移除,并通过调度器自动重新拉起Executor。新启动的Executor会重新注册到Driver中,Driver会根据DAG给Executor重新分配相关的Task。Executor分配到到来自Driver的Task,需要重checkpoint重新加载数据并继续执行计算。Spark运算数据行程DAG,如果遇到不同的Executor之间有数据交互时(比如ExecutorA的数据聚合依赖于ExecutorB和ExecutorC,ExecutorB宕机,ExecutorA的数据聚合也不准确),不能简单的通过启动对应的Executor相关的数据进行恢复(可能会有数据紊乱),通常恢复的时间较久

3.3 RDD容错

窄依赖
指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区 或多个父RDD的分区对应于一个子RDD的分区,也就是说一个父RDD的一个分区不可能对应一个子RDD的多个分区。

宽依赖
指子RDD的分区依赖于父RDD的多个分区或所有分区,即存在一个父RDD的一个分区对应一个子RDD的多个分区。

checkpoint机制
是为了通过lineage做容错的辅助,lineage过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的RDD开始重做Lineage,就会减少开销。

注意
1, 在容错机制中,如果一个节点死机了,而且运算窄依赖,则只要把丢失的父RDD分区重算即可,不依赖于其他节点。
2, 而宽依赖需要父RDD的所有分区都存在,重算就很昂贵了。如果恢复的代价过于昂贵,就会通过checkpoints重新进行计算。
3,利用checkpoint机制,记载最新的数据计算点,重新拉起任务进行计算

4. 疑问和思考

4.1 是否可以部署多个Driver,形成HA模式,如果主Driver宕机,备Driver自动接替?

可以,基于ZK进行选主。

5. 参考文档

  • Spark 容错以及高可用性HA
  • Spark 容错机制
  • Spark on Kubernetes作业执行流程
  • Spark on Yarn运行机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HBase入门:运行机制

文章目录 HBase 系统架构客户端ZooKeeper 服务器Master 主服务器Region 服务器 Region 服务器工作原理用户读写数据的过程缓存的刷新StoreFile合并 Store 的工作原理HLog 的工作原理 HBase 系统架构 HBase 的系统架构包括客户端、ZooKeeper 服务器、Master 主服务器、Region服…

Linux文本三剑客---grep

grep(从文本或字符串种过滤特定内容。) 格式:Usage: grep [OPTION]... PATTERNS [FILE]... 常用选项: -E 等价于 egrep 扩展正则 -i 忽略大小写 -w 匹配单词 -o 仅显示匹配内容 -r 递归匹配 -c 统计匹配的行数 -v 取反 -n 行号 -A…

vue2 事件总线

原图下载:https://download.csdn.net/download/weixin_47401101/88788636

如何在Shopee平台上进行宠物类目的选品丨shopee宠物选品

在Shopee平台上进行宠物类目的选品是一个重要的任务,它直接关系到卖家的销售业绩和市场竞争力。为了成功选择适合的宠物用品,在选品过程中,卖家可以遵循以下策略: 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#…

ZYNQ AC7020C的“点LED”实验

一、创建 Vivado 工程 1、启动 Vivado 2、在 Vivado 开发环境里点击“Create New Project”,创建一个新的工程 3、弹出一个建立新工程的向导,点击“Next” 4、在弹出的对话框中输入工程名和工程存放的目录。需要注意工程路径“Project location”不能有…

瑞丽杂志引领潮流,VOSS眼镜概念店开启奢华新纪元!

近日,由《瑞丽》杂志社举办的2023第4届瑞丽轻奢品牌大赛,以“轻奢•悦藏”为主题的大赛已圆满结束,VOSS眼镜荣获:2023瑞丽轻奢品牌大赛「轻奢时尚风格奖」,作为眼镜行业唯一获此奖项的品牌,VOSS眼镜对此表示…

C++初阶入门之命名空间和缺省参数的详细解析

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.前言 二.命名空间 2.1命名冲突的例子 2.2解决方案 2.3命…

QT发生弹出警告窗口

QTC开发程序弹出警告窗口&#xff0c;如上图 实施代码&#xff1a; #include <QMessageBox> int main() {// 在发生错误的地方QMessageBox::critical(nullptr, "错误", "发生了一个错误&#xff0c;请检查您的操作。");}上面的文字可以更改&#x…

(2024,预训练和微调扩散,图编码器,图特征与CLIP特征对齐)场景图到图像合成:集成 CLIP 指导与扩散模型中的场景图条件

Scene Graph to Image Synthesis- Integrating CLIP Guidance with Graph Conditioning in Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 扩…

配置ARP安全综合功能示例

组网图形 ARP安全简介 ARP&#xff08;Address Resolution Protocol&#xff09;安全是针对ARP攻击的一种安全特性&#xff0c;它通过一系列对ARP表项学习和ARP报文处理的限制、检查等措施来保证网络设备的安全性。ARP安全特性不仅能够防范针对ARP协议的攻击&#xff0c;还可以…

Servet的基础学习

Servet的基础学习 servet的简单介绍 Servlet 是运行在 Web 服务器或应用服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet&#xff0c;您可以收集来自网页表单的用户输入&#xff0…

插槽(64-67)

文章目录 插槽1.插槽 - 默认插槽(组件内可以定制一处结构)2.插槽 - 后备内容&#xff08;默认值&#xff09;3.插槽 - 具名插槽(组件内可以定制多处结构)4.作用域插槽(插槽的一个传参语法) 插槽 插槽分类:默认插槽和具名插槽 1.插槽 - 默认插槽(组件内可以定制一处结构) 作用…

PyTorch初探:基本函数与案例实践

正文&#xff1a; 在熟悉了PyTorch的安装和环境配置后&#xff0c;接下来让我们深入了解PyTorch的基本函数&#xff0c;并通过一个简单的案例来实践这些知识。 1. 基本函数 PyTorch的核心是张量&#xff08;Tensor&#xff09;&#xff0c;它类似于多维数组&#xff0c;但可以…

2024年最热门的十个AI对话聊天模型网站

1、百度文言一心 文言一心”是一个基于百度自研的ERNIE模型的聊天机器人。 “文心一言”是百度依托飞桨、文心大模型的技术研发的知识增强大语言模型&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感…

Springboot注解@Aspect(二)JoinPoint 使用详解

目录 JoinPoint 的作用 JoinPoint 常用方法 示例 JoinPoint 的子类和关联类 JoinPoint 的作用 在 Spring AOP 中&#xff0c;JoinPoint 接口代表了一个程序执行的点&#xff0c;比如方法执行或异常处理。当使用 AOP 通知&#xff08;Advice&#xff09;时&#xff0c;你可以…

环形链表的检测与返回

环形链表 王赫辰/c语言 - Gitee.com 快慢指针的差距可以为除一以外的数吗&#xff1f;不可以如果差奇数则无法发现偶数环&#xff0c;是偶数无法发现奇数环&#xff0c;本题思路为指针相遇则为环&#xff0c;而以上两种情况会稳定差一&#xff0c;导致指针永不相遇 最终返回…

uniapp组件库Line 线条 的适用方法

目录 #平台差异说明 #基本使用 #线条类型 1.3.7 #兼容性 #API #Props 此组件一般用于显示一根线条&#xff0c;用于分隔内容块&#xff0c;有横向和竖向两种模式&#xff0c;且能设置0.5px线条&#xff0c;使用也很简单。 #平台差异说明 AppH5微信小程序支付宝小程序百…

阿里云幻兽帕鲁服务器4核16G配置报价

自建幻兽帕鲁服务器租用价格表&#xff0c;2024阿里云推出专属幻兽帕鲁Palworld游戏优惠服务器&#xff0c;配置分为4核16G和4核32G服务器&#xff0c;4核16G配置32.25元/1个月、10M带宽66.30元/1个月、4核32G配置113.24元/1个月&#xff0c;4核32G配置3个月339.72元。ECS云服务…

华为机考入门python3--(3)牛客3-明明的随机数

分类&#xff1a;集合、排序 知识点&#xff1a; 集合添加元素 set.add(element) 集合转列表 list(set) 列表排序 list.sort() 题目来自【牛客】 N int(input().strip()) nums set()for i in range(N):nums.add(int(input().strip()))# 集合转列表 nums_list l…

3.3 实验三:以太网链路聚合实验

HCIA-Datacom实验指导手册&#xff1a;3.3 实验三&#xff1a;以太网链路聚合实验 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;步骤 1 掌握使用手动模式配置链路聚合的方法步骤 2 掌握使用静态 LACP 模式配置链路聚合的…