spark程序中cache的作用 + 实验

本文深入探讨了Spark中Cache的功能和作用,通过实验对比了使用Cache前后对资源消耗的影响,强调了在多个计算步骤中重复使用同一RDD时使用Cache的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spark中cache的作用:

图例:

在这里插入图片描述
其中, result1和result2用到了同一个rdd(rdd2)做操作

如果rdd2不加cache:

由于spark程序为lazy操作, 所以在计算result1时, step1 -> step2 -> step3会全部走一遍, 计算result2时, step1 -> step2 -> step3也会全部走一遍, 其中step1 -> step2为重复步骤, 浪费了资源

如果rdd2加了cache:

计算result1时, step1 -> step2 -> step3会全部走一遍, 计算result2时, 直接从cache中取出rdd2, 只走了step3

实验:

demo代码1(rdd2不加cache):

在这里插入图片描述
其中rdd2没有加cache, 目录:C:/Users/Administrator/Desktop/hdfs/只加了两条日志, 所以结果应该是控制台输出了两组"test"(每组两个"test")

实验结果:

在这里插入图片描述

demo代码1(rdd2添加cache):

在这里插入图片描述
其中rdd2被cache, 所以结果应该是只输出了一组"test"(一组两个"test").

实验结果:

在这里插入图片描述

结论:

如果两个以上的计算步骤要使用同一个rdd, 建议使用cache

关键字:

spark离线计算, cache

个人说明:
阿幕, 一个喜欢听电音/trap/rnb, 喜欢看动漫, 喜欢玩我的世界的程序员

### Spark 内核原理 Spark 是一种分布式处理框架,旨在高效处理大规模数据集。其核心组件包括驱动器(Driver)、执行器(Executor),以及调度器(Scheduler)。驱动器负责协调整个应用程序的运行流程;执行器则是在集群节点上真正执行任务的部分;而调度器用于管理和分配资源。 #### 数据处理机制 在 Spark 中,RDD(弹性分布式数据集)作为基本抽象单位存在。它具有不可变性和容错能力等特点。当操作 RDD 时,并不是立即执行这些转换动作,而是记录下一系列的操作指令形成依赖关系图,直到遇到行动操作才会触发真正的计算过程[^1]。 对于内存管理方面,JVM 堆内内存大小决定了 `systemMaxMemory` 的上限值。为了防止内存溢出错误的发生,在配置参数时会考虑一定的安全裕度因子来预留一部分空间不被占用,以此减少由于估计偏差带来的风险[^2]。 #### 文件读取与传输优化 早期版本中 Map 阶段产生的临时文件数量较多,这增加了 I/O 开销并影响效率。后来通过对分区索引技术的应用使得 map 输出可以更有效地组织起来供 reduce 输入使用,降低了磁盘访问频率的同时也提高了整体吞吐量。此外 driver 节点能够预先加载必要的 jar 包至本地缓存区以便快速分发给各个 executor 使用,进一步提升了响应速度和并发性能[^3]。 ### 实验程序设计及其分析 考虑到上述特性,下面给出一段简单的 Python 程序用来展示如何利用 PySpark 来实现逻辑回归模型训练的过程: ```python from pyspark.sql import SparkSession import numpy as np def parsePoint(line): values = [float(x) for x in line.split(',')] return np.array(values[:-1]), int(values[-1]) if __name__ == "__main__": spark = SparkSession.builder.appName("LogisticRegression").getOrCreate() data = spark.read.text("/path/to/data").rdd.map(lambda r: r[0]) parsedData = data.map(parsePoint).cache() iterations = 100 D = 784 # Number of dimensions w = 2 * np.random.ranf(size=D) - 1 for i in range(iterations): gradient = parsedData.map( lambda point: (point[0] * ((1 / (1 + np.exp(-point[1]*(w.dot(point[0])))) - 1) * point[1])) ).sum() w -= gradient print(w) spark.stop() ``` 此代码片段实现了基于梯度下降法更新权重向量 \( \mathbf{w} \),以最小化损失函数为目标来进行二元分类的任务。注意这里假设输入特征维度为固定常数D=784,并且已经准备好了一个文本形式的数据源路径 `/path/to/data` 。每次迭代都会重新评估当前解的好坏程度,并相应调整方向直至收敛为止。 然而需要注意的是如果尝试直接修改全局变量 count,则可能会导致意外的结果因为该变量仅存在于 Driver 上下文中并不会同步回各 Executor 处。因此建议采用累加器(Accumulator)功能替代简单计数器模式下的共享状态维护方式[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值