私信我或关注微讯号:猿来如此呀,回复:学习,获取免费学习资源包。Spark程式中,为完成某些任务,往往经过许多步骤的转换处理,这些操作存在先后顺序和依赖关系(lineage血缘关系)。
对于复杂的任务,某个中间转换结果,可能会被多次呼叫,而每个中间结果的生成都是经过“千辛万苦”计算得到的。这就意味着,若中间结果A被呼叫N次,就要求每次呼叫时,先“千辛万苦”的把A的结果先计算出来,然后再进行呼叫。

如上图,RDD4作为中间转换结果,经过载入HDFS档案
àfilteràflatMapàmap,最终得到RDD4。RDD4作为中间结果,被后面的三个任务A,B,C分别进行呼叫。
如何避免”重复劳动”,提高程式执行效率呢?

Spark快取
基于上述场景,Spark提出了快取的解决方案。
Spark快取机制
在应用程序中,若某个中间结果(RDD)被多次呼叫(触发action),则可以将该中间结果(RDD)快取起来,第一次呼叫任务(触发action)时会先进行计算再快取(首次微慢一些),第二次及后续多次呼叫该中间结果资料执行任务时,则会直接从快取中读取进行操作。
这样会带来如下好处:
1:避免重复劳,相同的活只做一次;
2:因为资料在快取中,所以效率会很高。

Spark快取级别

生产环境中,根据需要,可以设定不同的快取级别,如上图,每个快取级别分析如下:
Ø val MEMORY_ONLY = new torageLevel(false, true, false, true)
预设快取级别,
第一个引数表示 :在内存不足的情况下,是否将未快取到内存的资料暂时储存到Executor程序所在的机器本地目录(尤其是shuffler后的中间结果,即使储存在磁盘, 也比从HDFS读取要快);
第二个引数表示:是否启用快取到内存;
第三个引数表示:第三个引数是否生效要参照第一个引数,若第一个引数为false,表示不启用磁盘,这个时候,第三个引数只能是false,设定为true,也没意义;
第四个引数表示:第四个引数是否生效要参照第二个引数,若第二个引数为false,表示不快取到内存,这个时候,第四个引数只能是false,设定为true,也没意义;就上面MEMOERY_ONLY 来说,第四个引数设定为true,表示快取到内存的资料是以普通的JAVA物件方式,而非序列化后的物件,所以实际占用内存空间要比原始档大一些。
假如资料很大,内存快取不下,则会尽可能的快取到内存,剩余的资料则在每次触发任务时,再临时读取HDFS上的部分资料。
Ø val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
表示不启用磁盘,只启用将资料快取到内存(内存的Heap),且快取到内存的资料先序列化(总的空间变小),注意:第四个引数为:false,表示开启序列化。
Ø val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
表示内存+本地磁盘同时开启(尽可能存内存,内存不足情况下,则将剩下的资料序列化到本地磁盘,有计算时,则先读内存,若没有,则再赵本地磁盘读取),且序列化,且每个快取的block块资料在本地一份(内存或者磁盘)的同时也同步到其它Worker机器上的相同任务下的内存/磁盘一份作为副本,多用来一定程度上容错。
Ø OFF_HEAP
使用堆外内存,把内存物件分配在Java虚拟机器的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机器)。能保持一个较小的堆,减少垃圾收集对应用的影响。

程式中设定快取
设定快取
通过对重复呼叫的中间结果(RDD)进行快取设定,预设方式如下:
rdd3.cache()
根据需要设定其它快取级别,方式如下
rdd3.persist(快取级别),如:
rdd3.persist(StorageLevels.MEMORY_AND_DISK)
释放快取
设定快取的中间结果(RDD)被呼叫结束,要进行释放,格式如下: rdd3.unpersist(true)
快取级别设定的参考依据
Ø 实际载入资料大小
假若中间结果资料不大(相比Executory内存来说),则可以考虑设定MEMORY_ONLY级别;若中间结果资料很大,就不能设定只加内存,否则任务会卡死(资料快取大,分配给计算的资源就会小),这个时候可以考虑内存+本地磁盘,因为资料在本地,所以也不会太慢。
Ø 分配的Executor-memory大小
Ø 当前worker节点服务器内存使用情况,
Ø 丛集中的worker上资源是否足够大,是否能容得下要被快取的资料
总结
实际应用中,什么时候需要对资料进行快取是门艺术,这通常需要对空间和速度进行权衡,垃圾回收开销的问题也会时不时让情况更复杂。一般情况下,如果多个动作需要用到某个中间结果(RDD),而它的计算代价又很高,那么就应该把这个RDD 快取起来。
私信我或关注微讯号:猿来如此呀,回复:学习,获取免费学习资源包。





























