Spark 缓存机制 + 共享变量

一、Spark中的缓存机制:

  避免spark每次都重算RDD以及它的所有依赖,cache()、persist()、 checkpoint()。

1、cache():会被重复使用,但是不能太大的RDD,将其cache()到内存当中,catch()属于 memory only 。cache 是每计算出一个要 cache 的 partition 就直接将其 cache 到内存中。缓存完之后,可以在任务监控界面storage里面看到缓存的数据。

spark cache (几种缓存方法):https://blog.csdn.net/zhuiqiuuuu/article/details/79290221

 

2、persist():可以设置缓存级别,如只在内存,只在磁盘,内存磁盘都用。

MEMORY_ONLY

MEMORY_AND_DISK

MEMORY_ONLY_SER

MEMORY_AND_DISK_SER

DISK_ONLY

MEMORY_ONLY_2, MEMORY_AND_DISK_2, 等等

持久化级别详解:http://bcxw.net/article/425.html

 

3、checkpoint():computing chain 计算链过长或依赖其他 RDD 很多的 RDD,就需要进行checkpoint,将其放入到磁盘当中。

  checkpoint 需要等到job完成了,在启动专门的job去完成checkpoint 操作,因此RDD是被计算了两次的。一般使用的时候配合rdd.cache(),这样第二次就不用重新计算RDD了,直接读取 cache 写磁盘。

  rdd.persist(StorageLevel.DISK_ONLY) 与 checkpoint 也有区别,persist一旦程序执行结束,所有的缓存无论在内存还是磁盘都会被删掉。而而 checkpoint 将 RDD 持久化到 HDFS 或本地文件夹,如果不被手动 remove 掉,是一直存在的,也就是说可以被下一个 driver,program 使用,而 cached RDD 不能被其他 dirver program 使用。

        同时:cache 跟 persist不会截断血缘关系,checkPoint会截断血缘关系。

 

补充:缓存太多的时候,spark会自动使用 LRU 缓存策略(最近最少使用缓存策略),将最老的分区从内存中移除。若下次使用被移除的分区时,只能重算。

 

二、spark中的共享变量:

spark中的共享变量有  累加器、广播变量

  共享变量出现的原因:通常在向spark中传递函数时,例如使用map或者filter传递条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一个新的副本,更新这些副本不会改变驱动器中的变量。spark累加器、广播变量就分别为结果聚合和广播突破了这一限制。

1、累加器:将工作节点的变量值聚合到驱动器程序中。

创建和取值方法见上。

常见应用:在调试时对作业执行过程中的事件进行计数。例如统计文件中的空行。

2、广播变量:让驱动程序高效的向所有工作节点发送一个只读值。例如发送一个只读的查询表。

 

posted @ 2019-12-18 15:32  guoyu1  阅读(2322)  评论(0编辑  收藏  举报