1. RDD的缓存
- Spark运算速度非常快的原因之一, 就是在不同操作中可以再内存中持久化或者缓存数据集.
- 当持久化某个RDD后, 每一个节点都将计算分区结果保存在内存中, 对此RDD或衍生出的RDD进行的其他动作中重用.
- 这使得后续的动作变得更加迅速.
- RDD相关的持久化和缓存, 是Spark最重要的特征之一.
- 缓存是Spark构建迭代式算法和快速交互式查询的关键.
那么?
- RDD缓存之后到哪里去了?
缓存在计算节点(worker)中每一个机器的内存当中 - 后续要使用到缓存的RDD时, 直接从内存中拿就可以了.
- 如何进行缓存(如何写代码?)
2. RDD缓存方式
- RDD通过persist方法或者cache方法可以将前面的计算结果缓存.
- 但是并不是这两个方法被调用时立即缓存, 而是触发后面的action时, 该RDD将会被缓存在计算节点的内存中,并供后面重用.
3. persist和cache的区别
- cache()方法: 默认调用了无参的persist(), 无参的persist方法默认带了一个参数StorageLevel.MEMORY_ONLY
- persist()无参方法默认带一个参数, StorageLevel.MEMORY_ONLY.
- persist方法可以收到的选择缓存方法
- 缓存有可能丢失, 或者存储于内存的数据由于内存不足而被删除, RDD的缓存容错机制保证了即使缓存丢失也能保证计算的正常执行.
- 通过基于RDD的一系列转换,丢失的数据会被重算, 由于RDD的各个Partition是相对独立的, 因此只需要计算丢失的部分即可,并不需要重新算全部的Paritition.
rdd.persist(StorageLevel.MEMORY_AND_DISK_2)
- Action动作后就是一个Job, 一个Job结束后, 会启动另一个Job执行缓存.
- 缓存后血统不会改变.
- rdd执行完Action动作后, 才会触发缓存动作,
- 经常缓存的是shuffle后的RDD
4. checkpoint设置检查点
- cacha()和persist()方法, 在磁盘换掉的情况下, 缓存就不起作用了.
- 为了防止磁盘损坏造成数据丢失, 重要的数据(Shuffle后的数据)除了使用cache和persist方法外, 还要设置检查点checkpoint
- 代码表达方式:
sc.setCheckponitDir("./ck")
- shuffle后的RDD, 设置检查点
result.checkpoint()
- 在生产环境中,通常将
sc.setCheckpointDir("hdfs://node01:8020")
主要目的就是: 天然借助HDFS副本机制,可以防止数据丢失 - cache&persist&checkpoint的区别:
cache&persist这两个缓存之后,RDD的血统没变
checkpoint操作之后,血统关系就断了,就没有血统关系了. - 缓存和checkpoint设置之后的读取顺序
读取顺序: cache–>checkpoint–>重新计算 - checkpoint在什么时候操作
在当前的任务(job)执行完成之后,重新起一个job来进行checkpoint
设置checkpoint之后,job就有两个
一个action动作后,之前的一系统RDD就是一个job
5. hdfs副本保存位置
- 一份保存在本台机器上
- 一份保存在同一个机架的另一台机器上
- 一份保存在另一个机架(rack)的一台机器上.