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

  • 相关阅读:
    商城问题
    web基础重难点
    业务流程
    主流框架面试题
    数据库:索引-引擎-优化
    【jquey代码】基于选中的checkbox 删除对应的一行数据
    javascript中获取json对象的value,拼接到页面上
    【json对象和json格式的字符串】
    【idea中创建springMVC项目的2个坑】不识别@Autowired 以及 Mapper.xml的配置
    【eclipse和idea】创建spring项目时的一处不同
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12060105.html
Copyright © 2020-2023  润新知