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
相关产品推荐
相关产品推荐

