一、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、广播变量:让驱动程序高效的向所有工作节点发送一个只读值。例如发送一个只读的查询表。