AWS Glue运行jar生成csv文件无法访问及读取问题咨询
问题解答
问题1:配置./filename作为存储路径时的实际存储位置
你配置的相对路径./对应的是AWS Glue作业Driver节点的本地临时文件目录/tmp,也就是说你配置的./filename实际生成路径是/tmp/filename。
需注意:你在Glue作业配置中指定的TempDir是S3存储路径,和这个Driver本地的/tmp目录完全无关,直接读取S3的TempDir路径自然找不到本地生成的文件。
问题2:如何读取该文件生成DynamicFrame
你不需要额外创建EC2实例或EMR集群,按以下步骤操作即可:
- 第一步:先验证文件是否已生成在本地目录,可在脚本中加入以下代码确认:
import os print(os.listdir("/tmp")) # 输出/tmp下的所有文件,确认目标filename是否存在
- 第二步:使用boto3将本地生成的文件上传到你有权限的S3存储桶中,示例代码如下:
import boto3 s3 = boto3.client('s3') # 替换为你自己的桶名和S3目标存储路径 bucket_name = "your-bucket-name" s3_target_path = "glue_temp/filename.csv" # 上传本地/tmp下的文件到S3 s3.upload_file("/tmp/filename", bucket_name, s3_target_path)
- 第三步:读取S3上的文件生成DynamicFrame,修改原有代码即可:
create_jar_frame = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options = {"paths": [f"s3://{bucket_name}/{s3_target_path}"], "recurse": True}, format="csv" )
额外注意事项
- Glue Driver节点的本地临时磁盘默认有20GB左右的存储空间,如果你的jar生成的文件体积较大,可以给作业配置更高的DPU,或开启弹性磁盘配置避免磁盘不足。
- 只有当你用UDF把jar调用逻辑分发到Executor执行时,jar才会运行在Executor节点上,此时每个Executor的
/tmp目录独立,需要单独处理对应节点的本地文件上传;常规在Glue主脚本中直接调用subprocess都是运行在Driver节点,按上述步骤操作即可。
内容的提问来源于stack exchange,提问作者Elhan Shaji
相关产品推荐
相关产品推荐

