如何在AWS无服务器环境中用自定义程序批量处理S3日志文件
解决方案
一、AWS Glue Jobs 实现方案
完全可以用Glue Jobs实现,无需下载全部5TB数据,核心思路是分批次下载并处理:
文件分组逻辑
用Glue Python脚本遍历输入S3桶的所有对象,通过boto3.list_objects_v2获取每个文件的大小,循环累加文件体积,每凑够X MB就形成一个处理批次,记录该批次的文件列表。批次处理流程
- 对每个批次,将文件下载到Glue的临时目录(
/tmp),Glue Python Shell Worker默认提供10GB临时空间,若X MB超过该值,可选择更大的Worker类型(如G.2X提供64GB临时空间)。 - 通过
subprocess.run调用自定义可执行程序,指定临时目录作为输入源,让程序合并处理该批次文件。 - 处理完成后,将生成的输出文件上传到目标S3桶,随后删除临时目录下的输入、输出文件,释放空间处理下一个批次。
- 对每个批次,将文件下载到Glue的临时目录(
注意事项
- 将自定义可执行程序打包上传到S3,在Glue Job启动时下载到临时目录并赋予执行权限(
chmod +x)。 - 启用Glue Job的重试机制,避免因网络或程序异常导致批次处理失败。
- 将自定义可执行程序打包上传到S3,在Glue Job启动时下载到临时目录并赋予执行权限(
二、无服务器替代方案:Step Functions + Fargate
如果Glue的临时空间或执行时长无法满足X MB需求,可采用无服务器容器方案:
编排逻辑
- 用Step Functions创建状态机:第一步调用Lambda获取输入S3的所有文件并分组为X MB的批次;第二步并行或串行启动Fargate任务处理每个批次。
- Fargate任务可配置最高200GB的临时存储,完全覆盖X MB的块大小需求。
任务执行流程
- Fargate任务启动后,下载对应批次的S3文件到容器临时目录。
- 调用预装在容器镜像中的自定义可执行程序完成合并转换。
- 将输出文件上传到目标S3桶,任务结束后自动释放资源。
三、Lambda(限小批次场景)
若X MB小于10GB(Lambda临时存储上限),且单个批次处理时间不超过15分钟,也可使用Lambda实现:
- 先通过Lambda或Step Functions完成文件分组。
- 每个Lambda实例处理一个批次,下载文件到
/tmp,调用自定义程序,上传结果后清理临时文件。
内容的提问来源于stack exchange,提问作者mfcss
相关产品推荐
相关产品推荐

