用了这么久spark了,当天总结下他的一些优化方面的**原理,当天咱们分这么几个方面来谈:
一.RDD
RDD是弹性散布式数据集的简称,他是其余起初者,比如DataFrame,DataSet等的基础。他有四大**属性,如下所示。
这4 大属性又可以划分为两类,横向属性和纵向属性。其中,横向属性锚定数据分片实体,并规则了数据分片在散布式集群中如何散布。
纵向属性用于在纵深方向构建 DAG,经过提供重构 RDD 的容错才干保证内存计算的稳固性。
其实RDD还有个个性:优先位置列表.算上他总共有5大个性。文言文总结就是:3个列表,2个函数。3个列表是分区列表,依赖列表和优先位置列表;2个函数就是:计算函数和分区函数。
二.内存计算
在 Spark 中,内存计算有两层含意:第一层含意就是妇孺皆知的散布式数据缓存,第二层含意是 Stage 内的流水线式计算形式。
流水线计算形式指的是:在同一 Stage 外部,一切算子融合为一个函数,Stage 的输入结果由这个函数一次性性作用在输入数据集而发生。
所谓内存计算,不只仅是指数据可以缓存在内存中,更关键的是,经过计算的融合来大幅优化数据在内存中的转换效率,进而从全体上优化运行的口头性能。
比如这个栗子:
如图所示,在上方的计算流程中,假设你把流水线看作是内存,每一步操作事先都会生成暂时数据,如图中的 clean 和slice,这些暂时数据都会缓存在内存里。但在上方的内存计算中,一切操作步骤如clean、slice、bake,都会被捏合在一同导致一个函数。这个函数一次性性地作用在“带泥土豆”上,间接生成“即食薯片”,在内存中不发生任何两边数据外形。
补充下:从程序员的视角登程,DAG 的构建是经过在散布式数据集上不停地调用算子来成功的,DAG 以 Actions 算子为终点,从后向前回溯,以Shuffle 操作为边界,划分出不同的 Stages。同一 Stage 内一切算子融合为一个函数,Stage的输入结果由这个函数一次性性作用在输入数据集而发生。