陕西高速公路建设集团网站,家在龙岗,炫酷一些的网站,wordpress用阿里云oss1.RDD的数据是过程数据
RDD之间进行相互迭代计算#xff08;Transaction的转换#xff09;#xff0c;当执行开启后#xff0c;代表老RDD的消失
RDD的数据是过程数据#xff0c;只在处理的过程中存在#xff0c;一旦处理完成#xff0c;就不见了。
这个特性可以最大化…1.RDD的数据是过程数据
RDD之间进行相互迭代计算Transaction的转换当执行开启后代表老RDD的消失
RDD的数据是过程数据只在处理的过程中存在一旦处理完成就不见了。
这个特性可以最大化的利用资源老旧的RDD没有用了就从内存中清理给后续的计算腾出内存空间。内存中只存在一个RDD
2.RDD的缓存
当然Spark也有缓存技术Spark提供了缓存API可以让我们通过调用API将指定的RDD数据保留在内存或者硬盘上。保留了RDD的血缘关系。
RDD的缓存技术是分散存储的分区数据各自存储到Executor所在的服务器上。
有时候一个前置RDD会被多个后续RDD使用所以需要持久化一下
3.RDD的CheckPoint
CheckPoint也是将RDD的数据保存起来但是它仅支持硬盘存储但是它不保留血缘关系。
CheckPoint技术是将RDD各个分区的数据集中存储到HDFS上
有时候一个前置RDD会被多个后续RDD使用所以需要持久化一下
4.Jieba库用于中文分词
5.广播变量
使用场景有时候一个Executor会处理多个分区数据这些分区数据是接受相同的数据的这个时候就不需要数据源一一给这些分区发一份分区数据了只需要给这个Executor发一份数据就好其所管辖的分区共享这份相同的数据。可以节约资源降低IO节约内存。
使用方式使用boardcast()接口将本地需要发送给分区的变量标记为广播变量就可以了
本地集合对象 和 分布式集合对象RDD进行关联的时候需要将本地集合对象 封装为广播变量。可以节省网络IO的次数Executor的内存占用
6.累加器
可以实现分布式的累加功能将各个分区的值累加到一起
Spark为我们提供了专门的累加器变量
7.小总结
广播变量解决了什么问题
分布式集合RDD和本地集合进行关联使用的时候降低内存占用以及减少网络IO的传输提高性能。
累加器解决了什么问题
分布式代码的执行过程中进行全局累加。
---------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------Spark内核调度重点理解
8.DAG
DAG有向无环图有方向没有形成闭环的一个执行流程图其实就是代码的一个执行流程图RDD的转换。。。。RDD的执行罢了眼睛看着代码就能分析出来
eg 上图中有三个DAG。
此外上图也可以看出一个程序Application可能有多个Job一条执行路线就是一个Job可以理解为上图程序做了三件事也可以说一个Action会产生一个Job一个应用程序内的子任务
一个Application中可以有多个JOB每一个JOB内含一个DAG同时每一个JOB都是由一个Action产生的。
带有分区关系的DAG图其实就是在有向无环的DAG图中把分区关系画出来而已。
9.DAG的宽窄依赖和阶段划分
窄依赖父RDD的一个分区全部将数据发给子RDD的一个分区
宽依赖父RDD的一个分区将数据发给子RDD的多个分区。宽依赖的别名shuffle
10.DAG的阶段划分
对于Spark来说会根据DAG按照宽依赖划分不同的DAG阶段
划分依据从后向前遇到宽依赖就划分出一个阶段称之为stage
在stage的内部一定都是窄依赖。
例如下图的两个stage 11.Spark是怎么做内存计算的DAG的作用Stage阶段划分的作用
1.Spark会产生DAG图
2.DAG图会基于分区和宽窄依赖关系划分阶段
3.一个阶段内部都是窄依赖窄依赖内如果形成前后11的分区对应关系就可以产生许多内存迭代计算的管道
4.这些内存迭代计算的管道就是一个个具体的执行Task
5.一个Task是一个具体的线程任务跑在一个线程内就是走内存计算了。
12.Spark为什么比MapReduce快
1.Spark的算子十分丰富MapReduce算子匮乏Map和ReduceMapReduce这个编程模型很难在一套MR任务中处理复杂的任务很多复杂的任务是需要写多个MapReduce进行串联多个MR串联通过磁盘交互数据。
2.Spark可以执行内存迭代算子之间形成DAG基于依赖划分阶段之后在阶段内形成内存迭代管道。但是MapReduce的Map和Reduce之间的交互依旧是通过硬盘来交互的。
综上总结
a.编程模型上Spark占优算子丰富
b.算子交互上和计算上可以尽量多的内存计算而非磁盘迭代
13.Spark的并行度
在同一时间内有多少个Task在同时运行
推荐设置全局并行度不要针对RDD改分区这可能会影响内存迭代管道的构建或者会产生额外的Shuffle。
确保是CPUh核心数量的整数倍最小是2倍最大一般10倍或者更高均可。
14.Spark的任务调度
Spark的任务由Driver进行调度这个工作包含
a.逻辑DAG的产生
b.分区DAG的产生
c.Task划分
d.将Task分配给Executor并监控其工作
15.Driver内的两个组件
DAG调度器
工作内容将逻辑的DAG图进行处理最终得到逻辑上的Task划分
Task调度器
工作内容基于DAG Schedule的产出来规划这些逻辑的task应该在哪些物理的executor上运行以及监控它们的运行。
16.Spark中的名词概念汇总
Application/应用用户代码提交到Spark去运行的时候这就是一个应用。一个Application由一个Driver去控制它的运行。
Application jar如果是Java语言编写的程序可以打成一个Application jar的jar包。
Driver program程序main方法的入口也是程序的调度者和管理者也负责构建SparkContext。
Cluster manager/集群管理器一个外部服务用于管理整个集群的资源也就是Master角色的东西
Deploye mode/部署模式一般用YARN模式又分为客户端模式 和 集群模式
Worder node/Worker角色单台服务器的资源管理者负责在单个机器内去提供Spark程序运行所需要的资源。
Executor/程序的运行启动器内部可以分为许多Task可以理解为真正干活的。
Task/一个工作线程它是Executor内最小的一个工作单元这个工作单元对整个Spark任务进行任务的干活。
Job/并行化的计算集合Job归属于Application一个Application可以有多个Job。
Stage/阶段在Job内部基于DAG关系图可以划分出许多Stage划分依据宽依赖每个stage内部都是窄依赖又因为是窄依赖便可以构建内存迭代的管道然后去设定并行的Task。
层级关系梳理
1.一个Spark环境可以运行多个Application
2.一个代码跑起来会成为一个Application
3.Application内部可以有多个Job
4.每个Job由一个Action产生并且每个Job有自己的DAG执行图
5.一个Job的DAG图会基于宽窄依赖划分成不同的阶段。
6.不同的阶段内会基于分区数量形成多个并行的内存迭代管道
7.每一个内存迭代管道形成一个TaskDAG调度器划分将Job内划分具体的task任务一个Job被划分出来的task在逻辑上称之为这个Job的taskset
以上就是Spark程序的运行原理重点理解。