文章目录
前言
Apache Spark是一个大规模数据处理框架,它提供了高效、快速和通用的数据处理能力。在Spark中,弹性分布式数据集(RDD, Resilient Distributed Dataset)是一个核心概念,而RDD的缓存机制则是确保Spark性能高效的关键因素之一。本文将通过’案例’,'图文’等解析方式深入探讨Spark RDD的缓存机制。
一、小试牛刀:解剖RDD缓存机制?
1. 什么是Spark RDD缓存策略
- 在Spark中,RDD的缓存机制允许我们将计算的结果存储在内存中,从而避免在后续的计算中重复计算相同的RDD。这对于迭代计算、机器学习等场景尤为重要,可以显著提高计算效率。
1.1 为什幺RDD要做缓存
- 当RDD被重复使用,或者计算该RDD比较容易出错,而且需要消耗比较多的资源和时间的时候,我们就可以将该RDD缓存起来。
- 主要作用: 提升Spark程序的计算效率
- 注意事项: RDD的缓存可以存储在内存或者是磁盘上,甚至可以存储在Executor进程的堆外内存中。主要是放在内存中,因此缓存的数据是不太稳定可靠。
由于是临时存储,可能会存在丢失,所以缓存操作,并不会将RDD之间的依赖关系给截断掉(丢失掉),因为当缓存失效后,可以全部重新计算且缓存的API都是Lazy惰性的,如果需要触发缓存操作,推荐调用“count算子” ,因为运行效率高
1.2 缓存相关API:
设置缓存的API:
rdd.cache(): 将RDD的数据缓存储内存中
rdd.persist(缓存的级别/位置): 将RDD的数据存储在指定位置
手动清理缓存API:
rdd.unpersist()
默认情况下,当整个Spark应用程序执行完成后,缓存数据会自动失效,会被自动删除
缓存的级别/位置:
DISK_ONLY: 只存储在磁盘
DISK_ONLY_2: 只存储在磁盘,并且有2个副本
DISK_ONLY_3: 只存储在磁盘,并且有3个副本
MEMORY_ONLY: 只存储在内存中
MEMORY_ONLY_2: 只存储在内存中,并且有2个副本
MEMORY_AND_DISK: 存储在内存和磁盘中,先放在内存,再放在磁盘
MEMORY_AND_DISK_2: 存储在内存和磁盘中,先放在内存,再放在磁盘,并且有2个副本
OFF_HEAP: Executor进程的堆外内存
工作中最常用的是: MEMORY_AND_DISK和MEMORY_AND_DISK_2
1.3 缓存案例解析:
# 导包
import os
import time
import jieba
from pyspark import SparkConf, SparkContext, StorageLevel
# 绑定指定的python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
def get_topN_keyword(etlRDD, n):
r1 = etlRDD.flatMap(lambda line_list: list(jieba.cut(line_list[2]))) \
.filter(lambda word: word not in ('.', '+', '的')) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda agg, curr: agg + curr) \
.top(n, lambda t: t[1])
print(r1)
def get_topN_search(etlRDD, n):
r2 = etlRDD.map(lambda line_list: ((line_list[1], line_list[2]), 1)) \
.reduceByKey(lambda agg, curr: agg + curr) \
.top(n, lambda t: t[1])
print(r2)
# 创建main函数
if __name__ == '__main__':
# 1.创建SparkContext对象
conf = SparkConf().setAppName('pyspark_demo').setMaster('local[*]')
sc = SparkContext(conf=conf)
# 2.数据输入
textRDD = sc.textFile('file:///export/data/sp