Spark会话重启后CACHE TABLE是否持久?本地存储读取优化咨询
远程存储数据读取优化方案与集群本地磁盘使用问题
场景背景
我有一个从远程存储读取数据的场景:
df = spark.read.load("abfss://mycontainer@mystorageacct.dfs.core.windows.net/mydata.csv")
这是一个几GB的小型数据集,加载耗时约1-2分钟。我每天手动运行同一个Notebook,希望做一些小优化。
关于cache()/persist()的疑问
看起来cache()和persist()无法起到作用,因为数据会在会话结束时被uncached/unpersisted?
本地存储缓存方案可行性
将数据写入集群本地存储再从中读取的模式是否可行,例如:
import os localfile = '/X/myfile.parquet' if os.path.exists(localfile): df = spark.read.parquet(localfile) else: df = spark.read.csv("abfss://mycontainer@mystorageacct.dfs.core.windows.net/mydata.csv") # do some basic munging df.write.parquet(localfile)
核心问题
如何确定集群驱动节点和工作节点的本地磁盘挂载位置,以及用户是否被允许写入这些磁盘?
更新:集群偶尔会重启,但频率不高。
解答
1. cache()/persist()的局限性
没错,cache()和persist()的缓存与Spark会话绑定,会话结束后缓存会自动清除,对于每天重启Notebook(即重启会话)的场景,确实无法复用缓存数据,这个方案不适用。
2. 本地存储缓存方案的可行性
这个方案是可行的,但需要注意几点:
- 若使用驱动节点本地存储:仅驱动节点能访问,适合单节点任务或数据量小到无需分布式处理的场景;如果是分布式任务,工作节点无法读取驱动节点的本地文件,会导致任务失败。
- 若使用集群工作节点的本地磁盘:需要用
file://路径配合Spark分布式写入,确保所有节点的本地路径一致,数据写入后能被各节点读取。这种方式在集群重启后数据会丢失,符合你“集群偶尔重启但频率不高”的情况,可接受。 - 格式选择:Parquet比CSV读取速度快很多,代码里的格式转换合理,能进一步减少读取耗时。
3. 确定本地磁盘挂载位置与写入权限
- 驱动节点本地磁盘:直接在Notebook执行Shell命令查看挂载点:
也可测试临时目录的写入权限,比如df -h/tmp:import os test_path = '/tmp/test_write' try: with open(test_path, 'w') as f: f.write('test') print(f"写入成功,路径{test_path}可写") os.remove(test_path) except Exception as e: print(f"写入失败:{e}") - 工作节点本地磁盘:通过Spark分布式任务执行Shell命令查看:
之后可从工作节点的spark.sparkContext.parallelize(range(10)).foreach(lambda x: os.system('df -h > /tmp/disk_info.txt'))/tmp/disk_info.txt查看挂载信息,也可通过集群管理界面(如YARN、平台控制台)查看节点配置,通常集群文档会标注默认本地存储路径。 - 权限验证:执行Shell命令查看目录权限:
若当前用户对应的权限位包含ls -ld /Xw,则具备写入权限。
内容的提问来源于stack exchange,提问作者Chris Snow
相关产品推荐
相关产品推荐

