You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 /X
    
    若当前用户对应的权限位包含w,则具备写入权限。

内容的提问来源于stack exchange,提问作者Chris Snow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:30:43