Spark内核的设计原理

news2024/11/24 23:08:35

导读:

本期是DataFun深入浅出Apache Spark第一期的分享,主讲老师耿嘉安开场介绍了自己的从业经历,当前就职的数新网络与Spark相关的两款产品赛博数智引擎CyberEngine和赛博数据智能平台CyberData。

本次分享题目为《Spark内核的设计原理》,主要介绍:

  • 初识Spark

  • Spark有哪些特点

  • Spark基本概念

  • Spark的核心功能

  • Spark模型设计

  • Spark部署架构

▌初识Spark

Spark是一个通用的并行计算框架,由加州伯克利大学的AMP实验室在2009年开发,并且在2010年以0.6版本开源,2013年左右成为Apache旗下在大数据领域最活跃的开源项目之一。

图片

▌Spark有哪些特点

Spark的基本特点可归纳为以下五点:灵活的内存管理,灵活的并行度控制,可选的Shuffle排序,避免重新计算,减少磁盘I/O。

图片

1.灵活的内存管理

减少了内存溢出的问题,用逻辑规划将JVM内存按照堆内/堆外,存储/计算分为四个象限。其中执行和存储内存的边界并不固定,通过逻辑规划来进行约定,可以相互借用,以此来提高内存资源的利用率,减少资源的浪费。Spark 1.4版本在内存管理器上通过“钨丝计划(Tungsten)”实现了一种与操作系统内存页非常相似的数据结构,内存管理可以直接向操作系统申请/释放内存,避免了JVM额外的开销,使得内存分配效率更加接近硬件。同时Spark有任务级别的内存管理,任务的计算属于执行内存的一部分。

图片

2.灵活的并行度控制

Spark通过Shuffle依赖的关系把不同的环节抽象为Stage的概念,允许多个Stage既可以串行执行,又可以并行执行提升并行度。同时Stage内部由一系列的RDD组成,RDD允许用户自定义自身的并行度,能够更加有效应对海量数据的场景。

3.科学的Shuffle排序

Hadoop早期的MR在Shuffle之前会有固定的排序,便于后期Reduce端拉取数据。对于Spark这点是可选步骤,根据场景特点可在Shuffle之前的Map端或者之后的Reduce端进行排序。

4.避免重新计算

从Stage构建出来的DAG血缘关系能够在执行失败的时候重新调度,加上对检查点的支持可以避免重复计算,这点对于大数据量场景下的稳定运行非常关键。

5.减少磁盘I/O

最早期的时候,Spark和MapReduce类似,在Map端生成中间数据时,会针对每个Reduce端生成文件,从而产生很多小文件。后期Spark版本优化引入分区索引,Map端不会为下游Reduce端单独生成小文件,而是通过索引构建文件的方式,用偏移量为下游Reduce端拉取数据做服务。每个分区是顺序写的方式,在Reduce端读数据的时候也是顺序读取,避免了随机读,减少了大量的磁盘I/O开销。同时Spark Driver端支持把通过spark-submit命令提交的jar包等资源文件缓存到本地服务内存中,在Executor端执行的时候可以直接通过Netty拉过去,也是一个节省I/O方面的改进。

6.Spark的其他特点

包括检查点支持,易于使用(支持Java,Scala,Python等编程语言),交互式(Spark Shell)和SQL分析(借鉴了ANSI SQL等标准的实用语法和功能),批流一体,丰富的数据支持,高可用,丰富的文件格式支持

图片

图片

▌Spark基本概念

图片

1. 弹性分布式数据集RDD

  • Spark的转换(transform)API可以将RDD封装为一系列具有血缘关系(DAG)的RDD。 

  • Spark的动作(action)API会将RDD及其DAG提交到DAGScheduler。

  • 转换API和动作API总归都是在处理数据,因此RDD的祖先一定是一个跟数据源相关的RDD,负责从数据源迭代读取数据。

图片

上图展示了Stage抽象和RDD分区的概念,体现了并行性;同时也展示了宽窄依赖的关系:图内的map和union是窄依赖,join和groupby是宽依赖。

2. 有向无环图DAG

在图论中,如何一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。Spark使用DAG来反映各RDD之间的依赖或血缘关系。

图片

3. 分区Partition

图片

上图A RDD有三个分区(Partition),通过分区器(Partitioner)(用户可以自定义)来进行区分,这样在Stage内部来进一步实现并行。

图片

4. 宽窄依赖Dependency

  • Narrow Dependency为窄依赖:子RDD依赖于父RDD中固定的Partition。分为OneToOne Dependency和 Range Dependency两种;

  • Shuffle Dependency为宽依赖:子RDD对父RDD中所有的Partition都可能产生依赖。子RDD对父RDD各个Partition的依赖将取决与分区计算器(Partitioner)的算法。

图片

5. Job/Stage/Task

执行一个动作API产生一个Job。Spark会在DAGscheduler阶段来划分不同的Stage,Stage分为ShuffleMapStage和ResultStage两种。每个Stage中都会按照RDD的Partition数量创建多个Task。ShuffleMapStage中的Task为ShuffleMapTask。ResultStage中的Task为ResultTask,类似于Hadoop中的Map任务和Reduce任务。

图片

6.Spark为什么用Scala(vs Java)

相比早期的Java,Scala能更好的支持面向函数的编程。同时对比Java,Scala拥有丰富的类型推断,丰富的语法糖和更现代的语法特性。但是同时其学习成本较高,可读性也不如Java。

图片

▌Spark核心功能

1.基础设施

  • SparkConf:用于管理Spark应用程序的各种配置信息;

  • Spark内置的RPC框架:用于跨机器节点不同组件间的通信,使用Netty实现,有同步和异步的多种方式,Spark各个组件的通信都依赖于此RPC框架。

  • 事件总线:SparkContext内部各个组件是如何通信的;

  • 度量系统:由Spark中的多种度量源(Source)和多种度量输出(Sink)构成,完成对整个Spark集群中各个组件运行状态的监控。

图片

2.SparkContext

内部隐藏了网络通信,分布式部署,消息通信,存储体系,计算引擎,度量系统,文件服务,Web UI等内容,应用程序开发者只需要使用SparkConext提供的API完成功能开发。

3.SparkEnv

是Spark中的Task运行所必须的组件,内部封装了RPC环境(RPCEnv),序列化管理器(Spark可以参数指定序列化方式),广播管理器(BroadcastManager),map任务输出跟踪器(MapOutputTracker),存储体系,度量系统(MetricsSystem),输出提交协调器(OutputCommitCoordinator)等Task运行所需的各种组件。

图片

4.存储体系

Spark优先考虑使用内存,在内存不足时才会考虑使用磁盘,在大数据场景下有性能提升。执行和存储内存之间是软边界,可以互相借用。同时通过钨丝计划可以更有效的利用系统的内存资源。在Spark早期还提供了以内存为中心的高容错的分布式文件系统Alluxio(原名Tachyon)供用户选择,除了JVM内存和磁盘,用户还可以写入Alluxio。这个支持才从原码里被移除前,用户可以从Spark外围比如S3把数据加载到Alluxio,使Alluxio和Spark之间可以更好的进行配合。

图片

5. 调度系统

  • DAG调度(DAGScheduler)负责创建Job,将DAG中的RDD划分到不同的Stage,给Stage创建对应的Task,抽象成Taskset,并将Taskset批量提交给TaskScheduler。

  • Task调度(TaskScheduler)负责按照FIFO或者FAIR等调度算法对批量Task进行调度;TaskScheduler的资源来自外部的调度系统(如Standalone,Yarn或者K8s),外部调度系统分配过资源后,TaskScheduler会进一步把资源分配给Task;同时将Task发送到集群管理器,分配给当前应用的executor,由executor负责执行工作。 以Yarn为例,Yarn把资源分配给Spark Driver后,Spark Driver与Yarn的NodeManager进行通信,NodeManager会帮Spark启动对应的Executor,之后Spark Diver会分发任务到Executor上,Executor会在本地的JVM中经过反序列化之后去调用对应的方法函数。

图片

6. 计算引擎

  • 内存管理器:分为堆外/堆内,计算/存储;

  • 任务内存管理器:计算内存被Task分享,每个Task会有自己的任务内存管理器;

  • Tungten(钨丝):除了JVM内存外,可以将计算和存储在堆外去进行开辟;

  • 外部排序器:根据任务的不同,可以在Map端或者Reduce端对ShuffleMapTask计算的中间结果进行排序聚合等操作;

  • Shuffle管理器:用于将各个分区对应的ShuffleMapTask产生的中介结果持久化到磁盘,并在Reduce端按照分区远程拉取ShuffleMapTask产生的中间结果。

图片

▌Spark的模型设计

  1.  编程模型

图片

如上图word count的代码,通过动作API触发提交到Driver里,Driver环境下有一些类,比如DAGScheduler会进行任务的划分,血缘的构建;TaskScheduler进行资源的调度;BlockManager管理需要存储的任务;RpcEnv进行通信。Driver环境与集群资源管理器交互来进行资源的申请,并分发任务到对应的工作节点比如Yarn的NodeManager,节点帮助拉起Executor去执行计算,Executor的中间或最终结果会访问存储。

2. RDD计算模型

RDD的每个分区(Partition)是靠分区计算器(Partitioner)得到,他们可以在多个节点的多个Executor上并行的执行。

图片

图片

▌Spark的部署架构

1. 集群管理器(Cluster Manager)

资源需要稳健的平台进行管理,不管是Spark自带的Standalone还是Yarn或者K8s都有自己自带的多节点分布式的管理能力,同时支持故障容错等功能。

图片

2. Worker

在拉起Executor的过程中,不同的集群管理器会选择不同的Worker;比如Standalone的Worker,Yarn的NodeManager,K8s的Node。Cluster和Worker在技术选型阶段让Spark提交到哪种集群上就已经确定了。

图片

3. Executor 和 4. Driver

Executor是在集群内拉起;Driver对于Yarn和K8s可以选择在集群外或者内部执行。

5. Application

举个例子:用户写了一个类,其中的main方法调了一批Spark API,把这个打成jar包,用spark-submit命令提交,运行在客户端,即为应用程序。如果Driver运行在客户端,Driver是应用程序JVM进程的一部分。 如果Driver运行在集群上,Driver的进程和应用程序的JVM进程是分开的。在资源分配上,集群管理器分配给应用程序/Driver的是一级资源,拉起Executor将资源分配给任务是二级分配。

图片

▌公司简介

浙江数新网络有限公司是一家专注于多云数据智能平台和数据价值流通的服务商。公司总部位于杭州,在上海、北京、深圳等各地设有分支机构,服务网络覆盖全国各区域,客户遍布全球 50+城市。数新网络自成立以来就在人工智能领域进行了深入的探索,已有成熟的产品、基于场景的解决方案及不同行业的成功案例。帮助金融、能源电力等行业相关企业实现数字化、智能化转型,提升企业新质生产力。

数新网络自主研发的一站式多云数据智能平台,主要包括赛博数智引擎CyberEngine、赛博数据平台CyberData、赛博智能平台CyberAI,可提供基于大数据的大模型调优、深度学习、价值流通等多种服务。数新网络自主研发的赛博数智引擎CyberEngine基于开源开放的设计理念,兼容开源引擎并进行深度优化,开放式架构支持主流引擎生态,支持多元异构引擎灵活插拔,支持流批一体、湖仓一体、数智一体等场景化能力。在此基础上,CyberEngine以Spark、Flink作为主计算引擎,以Spark为例,基于Spark实现数新网络的流批引擎、统一查询引擎,在性能、稳定性、云原生化等方面全面优于社区开源版本。 

▌数新网络高级架构专家 Spark Committer

耿嘉安

2014 阿里巴巴御膳房主力开发

2016 软件开发&大数据开发,出版畅销书籍《深入理解 Spark 》

2016 艺龙网大数据架构师,主导开发大数据平台

2017 360大数据专家,出版畅销书籍《 Spark 内核设计的艺术》

2018 360高级大数据专家,主导开发XSQL查询平台

2020 麒麟高级性能专家,主导 Kylin 执行引擎加速

2024 数新网络高级架构专家

分享嘉宾|耿嘉安 数新网络高级架构专家 Spark Committer

编辑整理|董晨

内容校对|李瑶 耿嘉安 包卓娜 王妍

出品社区|DataFun

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【测开能力提升-fastapi框架】fastapi能力提升 - 中间件与CORS

1. 中间件 1.1 介绍(ChatGPT抄的,大致可以理解) 一种机制,用于在处理请求和响应之前对其进行拦截、处理或修改。中间件可以在应用程序的请求处理管道中插入自定义逻辑,以实现一些通用的功能,如身份验证、…

系统架构设计师教程 第3章 信息系统基础知识-3.8 典型信息系统架构模型-解读

系统架构设计师教程 第3章 信息系统基础知识-3.8 典型信息系统架构模型-解读 3.8.1 政府信息化与电子政务3.8.1.1 电子政务的概念3.8.1.2 电子政务的内容3.8.1.2.1 政府与政府3.8.1.2.2 政府对企/事业单位3.8.1.2.3 政府对居民3.8.1.2.4 企业对政府3.8.1.2.5 居民对政府 3.8.1…

第一弹:基于ABAP OLE技术实现对服务器文件进行读写操作

前言 最近遇到这样一个需求,需要对BW服务器上的文件进行下载的同时写入每个用户相对应的数据。之前的服务器模版是一个死模版,对于这样的要求,我就想到了OLE技术,那么什么是OLE技术呢? 一、什么是OLE技术&#xff1f…

创建最佳实践创建 XML 站点地图--SEO

您是否正在努力让您的网站被搜索引擎索引?您想提高您网站的搜索引擎知名度吗?如果是,您可能会错过 XML 站点地图的重要性。XML 站点地图在改善您网站的 SEO 方面发挥着至关重要的作用。‍ XML 站点地图是您网站结构的蓝图,可帮助…

基于DPUSmartNic的云原生SDN解决方案

1. 方案背景与挑战 随着云计算,大数据和人工智能等技术的蓬勃发展,数据中心面临着前所未有的数据洪流和计算压力,这对SDN提出了更高的性能和效率要求。自云原生概念被提出以来,Kubernetes为云原生应用的落地提供了一个轻量级&am…

tolua++bug,int64强转double导致值不对

我C传值给lua,接口用的tolua。传过去值不对,我都懵逼了。是C强转问题。

C#中栈和堆以及修饰符

关于堆中字符串的存放 string s1"123" string s2"123" string s1"456" 此时s1输出为456 而s2仍然为123 因为在使用 String str "字符串" 的方式来创建String变量的时候,那么String的值便会存储在String常量池中&#x…

DevExpress中文教程 - 如何在.NET MAUI应用中实现Material Design 3?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件,该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 获取DevExpress v24.1正式版下载 Material Design是一个由Google开发的跨平台指南系统…

linux、windows、macos清空本地DNS缓存

文章目录 Linux:Windows:macOS: Linux: 对于使用systemd的操作系统(如CentOS 7、Ubuntu 16.04),可以使用以下命令重启systemd-resolved服务来清除缓存: sudo systemctl restart sys…

Mistral联合英伟达开源12B小模型:碾压Llama 3,单张4090可跑

小模型,成为本周的AI爆点。 与动辄上千亿参数的大模型相比,小模型的优势是显而易见的:它们不仅计算成本更低,训练和部署也更为便捷,可以满足计算资源受限、数据安全级别较高的各类场景。因此,在大笔投入大模型训练之余…

【ROS2】高级:安全-设置访问控制

目标:限制节点可以使用的主题。 教程级别:高级 时间:20 分钟 内容 背景 修改 permissions.xml签署策略文件 启动节点 使用模板 背景 在继续之前,请确保您已完成设置安全教程。 权限非常灵活,可以用来控制 ROS 图中的许…

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法,特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中,不可避免的会出现忘记密码的现象。普通用户的密码如果忘记,可以用更高权限的用户(例如root)进行重置。但是如果root用户的密码忘记了,由于root用户本身就是最高权限,那这个方法…

Vue自定义指令与Vue插槽学习

文章目录 自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项 自定义指令-指令的值1.使用效果2.语法 插槽-默认插槽1.作用2.用处4.插槽的基本语法 插槽-具名插槽1.作用2.具名插槽语法3.v-slot的简写 插槽总结1.插槽分类2.作用3.场景4.使用步骤 自定义指令 1.指…

WPS辟谣用户文档被用于AI训练:坚守个人信息保护底线

AITOP100平台获悉,7 月 21 日有网友在社交平台发文称“WPS 改版了用我们的文章喂给 AI 了”“WPS 疑似把我的审签内容喂给抖音豆包 AI”。这一消息引起了部分用户对于个人信息安全的担忧。针对这一传言,WPS官方客服微博于当日下午作出回应,明…

ARM功耗管理之功耗和安全

安全之安全(security)博客目录导读 思考:功耗与安全?超频攻击?欠压攻击?低功耗流程中的安全? 睡眠唤醒流程中,安全相关寄存器的备份恢复 举例:比如某DMA通道,芯片逻辑默认为安全通…

论文学习记录之一种具有边缘增强特点的医学图像分割网络

标题:一种具有边缘增强特点的医学图像分割网络 期刊:电子与信息学报-(2022年5月出刊) 摘要:针对传统医学图像分割网络存在边缘分割不清晰、缺失值大等问题,该文提出一种具有边缘增强特点的医学图像分割网…

【C语言】 利用栈完成十进制转二进制(分文件编译,堆区申请空间malloc)

利用栈先进后出的特性,在函数内部,进行除二取余的操作,把每次的余数存入栈内,最后输出刚好就是逆序输出,为二进制数 学习过程中,对存储栈进行堆区的内存申请时候,并不是很熟练,一开始…

【LaTeX Overleaf】 论文修订

对于在word中写的论文一般是使用【审阅】-【比较文档】来输出对比结果;对于overleaf,使用LaTeX排版,如何通过标记文字颜色来实现对比效果呢?? 1 批注功能-使用changes 宏包 在 LaTeX 中,changes 宏包是一个…

汽车技术智能化程度不断提升,线束可靠性如何设计?

随着汽车技术的高速发展,汽车自动化、智能化程度的逐步提高,人们对汽车的安全性、舒适性、娱乐性等要求也不断提高,加上汽车节能减排法规的不断严峻,整车电气设备不断增加,作为连接汽车各种电器设备“神经网络”的整车…