您的位置 首页 > 德语词汇

spark是什么意思 spark原理和实践

其实spark是什么意思的问题并不复杂,但是又很多的朋友都不太了解spark原理和实践,因此呢,今天小编就来为大家分享spark是什么意思的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

spark是什么意思 spark原理和实践

大数据的特性,数据是海量的,数据源是丰富多样的,有消息,图片,音视频流,数据产生的非常快,需要快速处理,提高数据价值。数据生成后,需要存储元数据信息,选择合适的存储格式,像Parquet、ORC是两种高性能的列式存储,Hudi数据存储的中间件,优化存储的读写,也可以存储到分布式文件存储系统HDFS,分布式消息系统kafka,keyvalue分布式存储的nosql引擎数据库HBase,基于列式存储的分布式数据库Kudu,字节提供的TOS,S3对象存储。存储的数据需要计算才能使用,大数据的计算框架,Spark批式计算,Flink流式计算,Presto等处理在线分布式查询场景的,是可交互式的OLAP引擎,计算框架借助资源管理的编排调度工具YARN,K8S,来运行在分布式集群中处理存储的数据。计算处理存储的数据后提供给上层应用,有BI报表,广告,推荐,金融风控等。

数据库中采集到的数据称为数据源,存储到分布式存储系统中HDFS等,进行一系列的数据处理,会有多次数据读取写入,可以是各种存储系统,也可以是各种数据库,讲处理的结果进行计算,再做各种应用。

批式计算:Hadoop、Hive、Spark流式计算:FlinkOLAP:presto,ClickHouse,Impala,DORIS

MapReduce解决了Hadoop诞生,数据大规模处理数据,主流Spark是基于内存处理,对MapReduce进行了优化。

Spark是用于大规模数据处理的统一分析引擎,是一种多语言引擎,可以用于单机节点或集群上来执行数据工程,数据科学和机器学习。

Spark生态&特点-SparkCore核心块基本功能:任务调度,内存管理-SparkSQL,操作结构化数据的核心组件,直接查询Hbase等各种各样的数据源,可以进行交互式的查询-StruturedStreaming流式计算框架,支持高吞吐的,可容错处理的,实时流式数据-MLlib,机器学习算法库,分类,聚类,回归等,模型评估,-GraphX分布式图处理框架,提供图计算,图挖掘的一些API

集群管理器,负责管理整个集群,负责资源管理和调度,监控Woker节点,Worker从节点,负责控制计算节点DeiverProgram,是一个APP整个应用的管理者,负责作业的调度,是一个JVM进程,创建一个SparkContext上下文,控制整个应用的生命周期

SparkLocalMode本地测试/单进程多线程模式

SparkSrandaloneMode不需要借助外部的资源调度管理,需要启动Spark的Sandalone集群的Master/Worker

依赖YARN/K8S依赖外部资源调度器用master完成不同的部署方式,委托给谁资源管理

用户选择了集群提交到外部资源管理器,比如说提交到YARN,在modemanagement创建一个appmaster,用来管理资源,是否有资源创建executor,APPmaster在YARN模式下相当于Driver也会通过DAG,TaskScheduler管理和分配Task。

Spark的数据输入到输出所有的数据结构都是基于RDD的,接下来从RDD开始说。

RDD是一个可以容错的,并行执行的分布式数据集,最基本的数据处理模型。

提供了各种各样的算子,就是成员函数,map,filter返回新的RDD;count返回新的数据类型。cache,persist(缓存)当一个RDD被多次使用,这个RDD计算链路非常长,那么计算结果就会非常珍贵。可以中间进行缓存,保存计算结果,这也是Spark速度快的原因,可以在内存中持久化缓存数据集。

比如map,filter,flatMap,groupByKey,reduceByKey.....

本来是一个Parallel的RDD,经过一个Map的操作后,变成了一个MapPartitionsRDD。

比如collect、count、take、saveAsTextFile.....

本来是一个RDD,做了一个count,触发了Job提交,返回了Long类型。take就是取前几个元素,触发了一个Job,返回了一个Array。

OneToOneDependency,是一对一的,返回对应Partition的list\nRangeDependency,inStart是父RDD起始的位置,outStart是子RDD起始的位置,length是range的长度,如果子RDD的partition的index在父RDD的range内,返回父RDD,返回父RDD的partition是子RDD的partition的index减去父RDD分区的range的起始,再加上子RDD分区range的起始\nPruneDependency\n宽依赖(会产生Shuffle):父RDD的每个partition都可能对应多个子RDD分区,都会使用所有父RDD的多个分区,就相当于是onetomany,当RDD做groupBy或Join操作时会产生宽依赖。

ShuffleDependency,Shuffle的产生是因为有宽依赖,宽依赖对应一个Shuffle的操作,运行过程中父RDD的分区,会传入不同的子RDD分区中,中间就可能涉及到多个节点的数据传输。

如果子RDD故障,有可能一部分父RDD就可以覆盖子RDD的计算,有时需要所有的父RDD进行重算,代价比较高。可以设置一个检查点checkpoint,然后涉及容错文件的系统工作,HDFS的检查点,把这些数据写入到检查点上,做高可用的数据存储,后面有节点宕机,数据丢失,可以从检查点的RDD计算,不需要从头到尾。

Job:RDDaction算子触发Stage:依据宽依赖划分Task:Stage内执行单个partition任务从后往前划分,遇到一个宽依赖,划分一个stage,遇到窄依赖就加入到这个stage,DAG最后一个阶段生成的partition生成的task叫ResultTask,其余的satge叫ShuffleMapTask因为都有一个Shuffle操作。最后一个RDDpartition的数量就决定了每个stagetask的数量。

一个action算子怎么去触发Job,到如何调度?

Executor内存主要有两类:Storage、Execution

启动Spark时,会设置一个spark.executor.memory参数,JVM的内存,堆内内存。缓存RDD数据或者广播数据,占用内存叫做存储内存StorageMemory。在处理shuffle时占用的内存叫执行内存ExecutionMemory,剩余的用户自定义数据结构,还有一些Spark内部的元数据,定义为UserMemory。

前两种内存可以互相借用,可以减少spill的操作,执行内存是不能够被存储内存所驱逐的,但执行内存需要内存时,可以驱逐被Storage借用的内存,直到达到一个规定的存储内存的边界。当双方空间都不足时,都需要存储到硬盘上。

为了进一步优化内存的使用,提高Shuffle的排序效率,Spark引入了堆外内存(。可以直接操作操作系统堆外内存,减少不必要的内存开销,扫描回收等,管理难度低,误差比较小。

在一个Executor内,所有的task是共享内存的,UnifiedMemoryManager统一管理多个并发Task的内存分配,Executor下可以运行多个task,每个task至少要获取1/2n的空间,如果不能满足,任务就会被阻塞,直到有足够的空间,任务才会被唤醒,n为当前Executor中正在并发运行的task数量。

map跟reduce之间数据处理重新分发的过程称之为Shuffle,创建一个ShuffleManger,在shuffleRDDcompute逻辑执行的时候会从,env里面get实现具体函数。

SortShuffleManger是Manager的一个实现方式,这个是两个数据量表大的时候常用的方法。对数据进行排序,Spill,产生多个零时的Spill磁盘文件,SpillFile,在最后,零时文件会合并成一个磁盘文件,为这些磁盘文件加一个索引,会产生两个文件,一个数据文件,一个索引文件。在下一个stage来的时候,在索引文件中找到partition所在的数据文件的位置,再在数据文件中找到数据。

ExternalShuffleService运行在主机上,管理这台主机Executor节点产生的shuffle数据,在YARN上就是NodeManager管理,只处理来自于map节点和reduce节点的请求,map节点会将Shuffle的文件路径告诉shuffleservice,reduce端去读取数据的时候就会发送一个请求获取streamid,再去获取数据。

AQE对于整体的SparkSQL的执行过程做了相应的调整和优化,它最大的亮点是可以根据已经完成的计划结点真实且精确的执行统计结果来不停的反馈并重新优化剩下的执行计划。

AQE框架三种优化场景(3.0版本):

处理的数据是比较大的,shuffle比较影响性能,这个算子比较费时,partition的个数非常关键,很难确定partition的数目应该是多少

在join中形成filter算子进行优化。实现在Catalyst中。动态获取Filter内容做相关优化,当我们将一张大表和一张小表等值连接时,我们可以从小表侧收集一些统计信息,并在执行join前将其用于大表的扫描,进行分区修剪或数据过滤。

前面是优化执行计划,找出最优的执行计划。另一种是在运行时优化,如何尽快的完成优化,提高全局利用率,消除数据倾斜,提高数据利用率。另一方面就是Codegen,局部优化,提高task的效率,从提高cpu与内存的利用率的角度来进行runtime优化。

表达式常规递归求值语法树。需要做很多类型匹配、虚函数调用、对象创建等额外逻辑,这些overhead远超对表达式求值本身,为了消除这些overhead,SparkCodegen直接拼成求值表达式的java代码并进行即时编译

传统的火山模型:SQL经过解析会生成一颗查询树,查询树的每个节点为Operator,火山模型把operator看成迭代器,每个迭代器提供一个next()接口。通过自顶向下的调用next接口,数据则自底向上的被拉取处理,火山模型的这种处理方式也称为拉取执行模型,每个Operator只要关心自己的处理逻辑即可,耦合性低。

火山模型问题:数据以行为单位进行处理,不利于CPUcache发挥作用;每处理一行需要调用多次next()函数,而next()为虚函数调用。会有大量类型转换和虚函数调用。虚函数调用会导致CPU分支预测失败,从而导致严重的性能回退

SparkWholestageCodegen:为了消除这些overhead,会为物理计划生成类型确定的java代码。并进行即时编译和执行。

Codegen打破了Stage内部算子间的界限,拼出来跟原来的逻辑保持一致的裸的代码(通常是一个大循环)然后把拼成的代码编译成可执行文件。

在大规模作业下,存在本地磁盘上,没有备份,有大量的请求,数量级很大,有热点数据反复读,spill数据会带来写放大,reduce高并发读取小数据块会带来磁盘随机访问的问题,也是低效率的问题,NodeManager的模块也会经常JC。解决方案:

CPU流水线/分支预测/乱序执行/CPU缓存友好/SIMD/...向量法/Codegen/两者结合,例如Intel:OAP

Spark参数很多,参数不合理的作业,对资源利用率/Shuffle稳定性/性能有非常大影响。自动化参数推荐/作业诊断——自动化

关于spark是什么意思到此分享完毕,希望能帮助到您。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023