注:文中图片引自书中
存储有涉及到的内容分为三个模块:内存管理、缓存机制、checkpoint机制
内存管理
各个task在jvm中共享整个存储空间,分布方式如上图所示
除图中标注的内容外,需要注意框架执行空间和数据缓存空间之间是可以转化的,当数据缓存空间不足时可以向框架执行空间挤压,但用完后归还;当框架执行空间内存不足时也可以从缓存空间挤压,但限度时50%的总框架内存空间,挤压后不会归还。
Shuffle时的内存情况:
1. shuffle write
(1)无聚合无排序分区少(<=200) BypassMergeSortBufferWriter
(2)无聚合无排序分区多(>200) SerializedShuffleWriter 数据分页存储,不需要连续的内存空间
(3)无聚合有排序 PairedPartitionBuffer
(4)有聚合有排序 PartitionedAppendOnlyMap 本质是一个数组,用二次地址探测法解决hash冲突
2. shuffle read
(1)无聚合无排序 只需要一个default 48MB的数组
(2)无聚合有排序
(3)有聚合有排序 AppendOnlyMap
缓存机制
需要注意的是LRU替换策略(缓存不足时)并不会替换掉同属于同一个RDD的partition,而基于双向链表的替换通过队尾插入替换队头的链表特性实现了LRU
checkpoint
通常用来做数据的HA,注意在对效率要求较高时,可采用Alluxio来做外部存储