大数据Spark有怎样的缓存机制

大数据Spark有怎样的缓存机制?首先Spark是开源的,所以翻看一下Spark的代码也能够多少了解一下Spark的缓存机制。在Spark较早的版本中,CacheManager的主要功能就是缓存,假设用户将一个分区的RDD 数据 cache了,当再次需要使用这份数据的时候是可以从缓存中进行提取的。
CacheManager底层存储是BlockManager,CacheManager负责维护缓存的元信息。在Spark的缓存中,就是把 RDD cache 在 Blockmanager 中存储,如果下次在需要 RDD,可以直接从缓存中获取,减少了重头再算的麻烦。

在缓存中,常见的有以下一些问题:持久化策略、RDD 缓存的过程、淘汰机制、缓存的更新问题等。这些问题在spark cache机制中都有相应的处理策略。
例如持久化策略:Spark为持久化 RDD 定义了几种不同的机制,用不同的 StorageLevel 值表示。尚学堂陈老师指出,rdd.cache()可将 RDD 存储为未序列化的 Java对象。当Spark在估计内存不够的情况下存放一个分区时,就可以在不同的内存中存放该分区,在下次需要的时候就可以重新计算。当对象需要频繁或低延访问时适合StorageLevel.MEMORY,可避免序列化的带来的成本。相比其他而言,该选项要占用更大的内存空间。同时也会影响Java GC回收的效率。

再例如RDD 缓存的过程,在RDD 缓存之前,Record空间无法连续,RDD在缓存到存储内存之后,Partition 变为Block,Record 在堆内或堆外存储内存中占用一块连续的空间。将Partition由不连续的存储空间转换为连续存储空间的过程,从而展开。
存储级别MEMORY_AND_DIS和MEMORY_AND_DISK_SE分别类似于MEMORY和 MEMORY_SER。对于 MEMORY 和 MEMORY_SER,如果一个分区在内存里放不下,整个分区都不会放在内存。对于 MEMORY_AND_DISK 和 MEMORY_AND_DISK_SER,如果分区在内存里放不下,Spark 会将其溢写到磁盘上。

假设数据是非序列化的数据,在 Unroll过程中,如果内存用着用着没有了,之前申请的内存也会自动释放,若是序列化的数据,则没有这一问题,可以在一开始就对需要多大内存进行计算。
大数据Spark有怎样的缓存机制?当然还有很多,比如淘汰机制、缓存的更新等等,在这里就不再详细描述。总之,数据的缓存对于包括Spark在内的大数据工具而言,如何安排空间与速度的关系始终是一门复杂的学问。这还要结合实际项目来考虑成本与效益的关系。
 

转载于:https://my.oschina.net/u/3628059/blog/1637816

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值