深入理解 Spark(一)spark 运行模式简介与启动流程源码分析

news/2024/7/27 7:30:24/文章来源:https://blog.csdn.net/weixin_44512041/article/details/135566265

spark 的运行模式

standalone 模式

在这里插入图片描述
以 standalone-client 为例,运行过程如下:
在这里插入图片描述

  1. SparkContext 连接到 Master,向 Master 注册并申请资源(CPU Core 和 Memory);
  2. Master 根据 SparkContext 的资源申请要求和 Worker 心跳周期内报告的信息决定在哪个 Worker 上分配资源,然后在该 Worker 上获取资源,然后启动 StandaloneExecutorBackend;
  3. StandaloneExecutorBackend 向 SparkContext 注册;
  4. SparkContext 解析 Applicaiton 代码,构建 DAG 图,并提交给 DAG Scheduler 分解成 Stage(当碰到 Action 操作时,就会催生 Job;每个 Job 中含有 1 个或多个 Stage,Stage 一般在获取外部数据和 shuffle 之前产生),然后以 Stage(或者称为 TaskSet)提交给 Task Scheduler,Task Scheduler 负责将 Task 分配到相应的 Worker,交给 StandaloneExecutorBackend 执行;
  5. StandaloneExecutorBackend 会建立 Executor 线程池,开始执行 Task,并向 SparkContext 报告,直至 Task 完成;
  6. 所有 Task 完成后,SparkContext 向 Master 注销,释放资源。

yarn 模式

yarn-client 模式

在这里插入图片描述

  1. Spark Yarn Client 向 YARN 的 ResourceManager 申请启动 ApplicationMaster。同时在 SparkContent 初始化中将创建 DAGScheduler 和 TaskScheduler 等。由于我们选择的是 Yarn-Client 模式,程序会选择 YarnClientClusterScheduler 和 YarnClientSchedulerBackend。
  2. ResourceManager 收到请求后,在集群中选择一个 NodeManager,为该应用程序分配第一个 Container,要求它在这个 Container 中启动应用程序的 ApplicationMaster。与 YARN-Cluster 的区别在在于该 ApplicationMaster 不运行 SparkContext,只与 SparkContext 进行联系进行资源的分派。
  3. Client 中的 SparkContext 初始化完毕后,与 ApplicationMaster 建立通讯,向 ResourceManager 注册,根据任务信息通过 ApplicationMaster 向 ResourceManager 申请资源(Container)。
  4. 一旦 ApplicationMaster 申请到资源(也就是 Container)后,便与对应的 NodeManager 通信,要求它在获得的 Container 中启动 CoarseGrainedExecutorBackend。CoarseGrainedExecutorBackend 启动后会向Client 中的 SparkContext 反向注册并申请 Task。
  5. client 中的 SparkContext 分配 Task 给 CoarseGrainedExecutorBackend 执行,CoarseGrainedExecutorBackend 运行 Task 并向 Driver 汇报运行的状态和进度,以让 Client 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
  6. 应用程序运行完成后,Client 的 SparkContext 向 ResourceManager 申请注销并关闭自己。

yarn-cluster 模式

在这里插入图片描述

  1. Spark Yarn Client 向 YARN RM 提交应用程序,包括 ApplicationMaster 程序、启动 ApplicationMaster 的命令、需要在 Executor 中运行的程序等。
  2. ResourceManager 收到请求后,在集群中选择一个 NodeManager,为该应用程序分配第一个 Container,要求它在这个 Container 中启动应用程序的 ApplicationMaster,其中 ApplicationMaster 进行 SparkContext 等的初始化。
  3. ApplicationMaster 向 ResourceManager 注册,这样用户可以直接通过 ResourceManage 查看应用程序的运行状态,然后它将采用轮询的方式通过 RPC 协议为各个任务申请资源,并监控它们的运行状态直到运行结束。
  4. 一旦 ApplicationMaster 申请到资源(也就是 Container)后,便与对应的 NodeManager 通信,要求它在获得的 Container 中启动 CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend 启动后会向 ApplicationMaster 中的 SparkContext 注册并申请 Task。这一点和 Standalone 模式一样,只不过 SparkContext 在 Spark Application 中初始化时,使用 CoarseGrainedSchedulerBackend 配合 YarnClusterScheduler 进行任务的调度,其中 YarnClusterScheduler 只是对 TaskSchedulerImpl 的一个简单包装,增加了对 Executor 的等待逻辑等。
  5. ApplicationMaster 中的 SparkContext 分配 Task 给 CoarseGrainedExecutorBackend 执行,CoarseGrainedExecutorBackend 运行 Task 并向 ApplicationMaster 汇报运行的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
  6. 应用程序运行完成后,ApplicationMaster 向 ResourceManager 申请注销并关闭自己。

Spark Client 和 Spark Cluster 的区别

  1. 理解 YARN-Client 和 YARN-Cluster 深层次的区别之前先清楚一个概念:ApplicationMaster。在 YARN 中,每个 Application 实例都有一个 ApplicationMaster 进程,它是 Application 启动的第一个容器。它负责和 ResourceManager 打交道并请求资源,获取资源之后告诉 NodeManager 为其启动 Container。从深层次的含义讲 YARN-Cluster 和 YARN-Client 模式的区别其实就是 ApplicationMaster 进程的区别。
  2. YARN-Cluster 模式下,Driver 运行在 AM(Application Master) 中,它负责向 YARN 申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉 Client,作业会继续在 YARN 上运行,因而 YARN-Cluster 模式不适合运行交互类型的作业。
  3. YARN-Client 模式下,Application Master 仅仅向 YARN 请求 Executor,Client 会和请求的 Container 通信来调度他们工作,也就是说 Client 不能退出。

spark 当中 RDD 的运行流程

在这里插入图片描述

spark standalone 集群通信框架

体系架构

在这里插入图片描述

启动过程

在这里插入图片描述

基于 netty 的 spark RPC 类继承结构

在这里插入图片描述

  1. 核心的 RpcEnv 是一个特质(trait),它主要提供了停止,注册,获取 endpoint 等方法的定义,而 NettyRpcEnv 提供了该特质的一个具体实现。
  2. 通过工厂 RpcEnvFactory 来产生一个 RpcEnv,而 NettyRpcEnvFactory 用来生成 NettyRpcEnv 的一个对象。
  3. 当我们调用 RpcEnv 中的 setupEndpoint 来注册一个 endpoint 到 rpcEnv 的时候,在 NettyRpcEnv 内部会将该 endpoint 的名称与其本身的映射关系,rpcEndpoint 与rpcEndpointRef 之间映射关系保存在 dispatcher 对应的成员变量中。
1. TransportContext 内部包含:TransportConf 和 RpcHandler
2. TransportConf 在创建 TransportClientFactory 和 TransportServer 都是必须的
3. RpcHandler 只用于创建 TransportServer
4. TransportClientFactory 是 Spark RPC 的客户端工厂类实现
5. TransportServer 是 Spark RPC 的服务端实现。创建的时候,需要 TransportContext 中的 TransportConf 和 RpcHandler。在 init 初始化的时候,由 TransportServerBootStrap 引导启动。
6. TransportClient 是 Spark RPC 的客户端实现。由 TransportClientFactory 创建,TransportClientFactory 在实例化的时候需要 TransportConf。TransportClient 创建好了之后,需要通过 TransportClientBootstrap 引导启动,创建好的 TransportClient 都会被维护在 TransportClientFactory 的 ClientPool 中。
7. ClientPool 是 TransportClientFactory 的内部组件,维护 TransportClient clientPool 池。TransportClientFactory 最重要的两个东西:1、提供了一个创建 RPC Client 的方法2、提供了一个管理 RPC Client 的组件
8. TransportServerBootStrap 是 Spark RPC 服务端 引导程序
9. TransportClientBootstrap 是 Spark RPC 客户端 引导程序
10. MessageEncoder 和 MessageDecoder 编解码器,存在于 TransportContext 的内部。可以集成多种不同的序列化机制。

在这里插入图片描述

spark standalone 集群启动脚本分析

在这里插入图片描述

spark standalone 集群启动过程分析

在这里插入图片描述

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

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

相关文章

ruoyi后台管理系统部署-4-安装nginx

yum 安装 ngix 1.24 yum 官方源安装: # 1. 需要预先安装 yum-utils sudo yum install yum-utils # 2. 配置yum repo touch /etc/yum.repos.d/nginx.repongix.repo: [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$…

ETF交易好不好?如何选择一个好的ETF基金?

作为普通投资者,交易ETF基金时,拥有证券账户即可,如同买卖股票一样操作,非常便捷,可以在盘中实时买卖。和投资股票相比较,风险相对较低。 首先,什么是ETF基金? ETF其实是一个缩写&#xff1a…

41k+ stars 闪电般快速的开源搜索引擎 docker安装教程

目录 1.下载 2.启动 成功示例 3.创建索引 4.插入数据 4.1下载数据 4.2插入数据 4.3查看数据 5.官方地址 1.下载 docker pull getmeili/meilisearch:latest 2.启动 mkdir -p /opt/meili_datadocker run -it --rm \-p 7700:7700 \-v /opt/meili_data:/meili_data \ge…

AI绘画学起来真的那么难吗?附全网最全教程!!

手把手教你入门绘图超强的AI绘画,用户只需要输入一段图片的文字描述,即可生成精美的绘画。给大家带来了全新保姆级教程资料包 (文末可获取) 随着2022年末ChatGPT的爆火,人们终于不能再忽视AI的强大了,AI绘…

Android studio RecyclerView 应用设计

一、创建empty activity项目: 二、打开activity_main.xml布局文件: 添加RecyclerView控件 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/…

浅谈对Maven的理解

一、什么是Maven Maven——是Java社区事实标准的项目管理工具&#xff0c;能帮你从琐碎的手工劳动中解脱出来&#xff0c;帮你规范整个组织的构建系统。不仅如此&#xff0c;它还有依赖管理、自动生成项目站点等特性&#xff0c;已经有无数的开源项目使用它来构建项目并促进团队…

【LabVIEW FPGA 编程入门】使用FPGA IO进行编程

1.在项目中新建一个VI&#xff0c;命名为FPGA IO Test。 2. 可以直接将项目中的FPGA IO拖入程序框图中。 FPGA IO的类型&#xff1a; 数字线&#xff1a; 数字端口&#xff1a; 模拟IO&#xff1a; 其他&#xff1a; 3.如果新增加了FPGA资源&#xff0c;不是创建项目时扫描到的…

C++算法学习心得五.二叉树(3)

1.合并二叉树&#xff08;617题&#xff09; 题目要求&#xff1a; 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么将他们…

用Python做一个2048小游戏

文章目录 逻辑设计绘图逻辑主循环 逻辑设计 2048的逻辑无非是操作 4 4 4\times4 44的方格&#xff0c;每个方格中有一个数&#xff0c;这些数可以移动&#xff0c;如果两个相同的数字在移动时相撞了&#xff0c;就可以彼此合并。 而这个 4 4 4\times4 44的方格&#xff0c;…

Jenkins自动化部署docker

Jenkins自动化部署docker和普通方式构建 docker外挂目录 准备测试服务器docker环境准备jdk环境将上传jar包修改为app.jar对外暴露1000端口启动jar FROM openjdk:8-jdk-alpine ARG JAR_FILE COPY ${JAR_FILE} app.jar EXPOSE 1000 ENTRYPOINT ["java","-jar&q…

搭建知识付费小程序平台:如何避免被坑,选择最佳方案?

随着知识经济的兴起&#xff0c;知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现&#xff0c;而知识付费小程序平台则成为了一个重要的渠道。然而&#xff0c;市面上的知识付费小程序平台琳琅满目&#xff0c;其中不乏一些不良平台&#xff0c;让老实人…

(学习日记)2024.01.09

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

CSS 下载进度条

<template><view class=btn>下载中</view></template><script></script><style>/* 设置整个页面的样式 */body {width: 100vw; /* 页面宽度为视口宽度 */background: #000000; /* 背景颜色为白色 */display: flex; /* 使用 flex…

领导看了就给我升职加薪的年终总结,我只花5分钟就写完了!

年末正是做总结的时候&#xff0c;如果你正苦于年终总结不知道该如何下手&#xff0c;ProcessOn刚好上线了AI一键帮你生成年终总结的活动&#xff0c;还可以下载成PPT格式&#xff0c;或许可以助你一臂之力&#xff0c;操作起来十分简单。当然&#xff0c;计划也可以一键生成&a…

Linux 内核大转变:是否将迈入现代 C++ 的时代?

Linux开发者 H. Peter Anvin 在邮件列表中重启了关于 Linux内核C代码转换为C的讨论&#xff0c;并陈述了自己的观点。说之前先看一下这个话题的历史背景。 早在2018年4月1日&#xff0c;Andrew Pinski提议将 Linux 内核源码转为 C&#xff0c;在文中写道之所以引入是由于以下优…

2023 年公链发展报告

作者&#xff1a;stellafootprint.network 2023 年&#xff0c;公链领域展现出强大的韧性和持续的创新力。这一年&#xff0c;比特币的强势回归、以太坊的稳步增长以及 Solana 的惊人崛起&#xff0c;共同绘制出一幅市场复苏的生动画面。在这一背景下&#xff0c;公链加密货币…

Springboot + websocket 实现 一对一 单人聊天

Springboot websocket 实现 一对一 单人聊天 要使用websocket ,需要添加 jar 打开项目中的pom.xml,添加以下内容 创建java端代码 配置websocke的endpoints 配置websocket的server ServerEndpoint(value "/websocket/{username}") 这句话 一定要注意, 这里 路…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

使用swift创建第一个ios程序

一、安装xcode 先到app store中下载一个Xcode app 二、创建项目 1、项目设定 创建ios app 2、工程结构 三、修改代码实现按键联动 四、运行测试

Arduino快速上手esp32方案开发

一、什么是ESP32&#xff1f; ESP32是Espressif Systems推出的一款高性能、低功耗的Wi-Fi和蓝牙双模系统级芯片&#xff08;SoC&#xff09;&#xff0c;广泛应用于物联网、智能家居、可穿戴设备等领域。它基于极低功耗的Tensilica Xtensa LX6微处理器&#xff0c;并集成了丰富…