尚学堂笔记:大数据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在内的大数据工具而言,如何安排空间与速度的关系始终是一门复杂的学问。这还要结合实际项目来考虑成本与效益的关系。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180317A0OE9700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券