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

AWS Glue Spark写入本地/tmp目录无文件问题求助

问题分析与解决方案

核心原因

Spark是分布式计算框架,当你执行df.write.options().csv("/tmp/testdir")时:

  • 每个Executor会在自身节点的本地/tmp/testdir目录生成数据文件
  • 你在Glue任务Driver节点查看的/tmp/testdir,仅为Driver本地目录,无法看到Executor节点上的文件
  • Pandas DataFrame是单进程在Driver端运行,写入的就是Driver本地的/tmp/testdir,因此能正常看到文件

Spark不会自动删除写入的文件,只是你查看的位置不对而已。

推荐解决方案

方案1:直接让Spark写入S3(最优)

Spark原生支持写入S3,无需中间本地文件步骤,处理大文件更高效,还能规避分布式环境下的本地文件同步问题。示例代码:

# 直接写入S3,可按需添加参数
df.write \
  .mode("overwrite")  # 可选:覆盖已有文件,其他值如append/ignore
  .option("header", "true")  # 可选:写入表头
  .csv("s3://your-bucket-name/target-path/")

Glue任务已默认配置S3访问权限,只需确保你的Bucket策略允许Glue角色访问即可。

方案2:强制让Spark写入Driver本地目录(仅适用于小数据集)

如果必须先写本地再上传,需将所有数据集中到Driver节点(注意:大文件会导致Driver内存溢出):

# 合并分区到1,强制在Driver端生成单个文件
df.coalesce(1) \
  .write \
  .mode("overwrite") \
  .csv("/tmp/testdir")

执行后,Driver的/tmp/testdir下会生成类似part-00000-xxx.csv的文件,之后再用transfer config上传即可。此方法仅适合小数据集,大文件会引发OOM错误。

方案3:使用Glue DynamicFrame写入

若你使用Glue的DynamicFrame,也可直接写入S3,更适配Glue环境:

from awsglue.dynamicframe import DynamicFrame

# 将Spark DataFrame转为DynamicFrame
dynamic_df = DynamicFrame.fromDF(df, glueContext, "dynamic_df")

# 写入S3
glueContext.write_dynamic_frame.from_options(
    frame=dynamic_df,
    connection_type="s3",
    connection_options={"path": "s3://your-bucket-name/target-path/"},
    format="csv"
)

总结

优先选择直接写入S3的方案,既贴合Spark分布式计算特性,又能避免本地文件同步问题,处理大文件更高效。强制写入Driver本地仅作为小数据集的临时方案。

内容的提问来源于stack exchange,提问作者Dhamothiran Sabitha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:57:33