【发布时间】:2019-08-23 20:53:56
【问题描述】:
我需要将一个压缩文件从一个 AWS S3 文件夹复制到另一个文件夹,并希望将其作为计划的 AWS Glue 作业。我找不到这样一个简单任务的例子。如果你知道答案,请帮忙。答案可能在 AWS Lambda 或其他 AWS 工具中。
非常感谢!
【问题讨论】:
-
我也会考虑成本。一个 Glue 作业至少需要 10 分钟的运行时间,而一个 lambda 作业只需 100 毫秒。
我需要将一个压缩文件从一个 AWS S3 文件夹复制到另一个文件夹,并希望将其作为计划的 AWS Glue 作业。我找不到这样一个简单任务的例子。如果你知道答案,请帮忙。答案可能在 AWS Lambda 或其他 AWS 工具中。
非常感谢!
【问题讨论】:
您可以这样做,并且使用 AWS Glue 可能是有原因的:如果您已链接 Glue 作业并且在成功完成 glue_job_#1 时触发了 glue_job_#2。
下面的简单 Python 脚本使用 boto3 库将文件从一个 S3 文件夹 (source) 移动到另一个文件夹 (target),并可选择删除 source 目录中的原始副本。
import boto3
bucketname = "my-unique-bucket-name"
s3 = boto3.resource('s3')
my_bucket = s3.Bucket(bucketname)
source = "path/to/folder1"
target = "path/to/folder2"
for obj in my_bucket.objects.filter(Prefix=source):
source_filename = (obj.key).split('/')[-1]
copy_source = {
'Bucket': bucketname,
'Key': obj.key
}
target_filename = "{}/{}".format(target, source_filename)
s3.meta.client.copy(copy_source, bucketname, target_filename)
# Uncomment the line below if you wish the delete the original source file
# s3.Object(bucketname, obj.key).delete()
Reference: Boto3 Docs on S3 Client Copy
注意:我会使用 f-strings 来生成 target_filename,但 f 字符串仅在 >= Python3.6 中受支持,我相信默认的 AWS Glue Python 解释器仍然是 2.7。
【讨论】:
tmp 文件夹? stackoverflow.com/questions/66376252/…
我认为您可以使用 Glue 来做到这一点,但使用 CLI 不是更容易吗?
您可以执行以下操作:
aws s3 sync s3://bucket_1 s3://bucket_2
【讨论】:
您可以使用 Glue 完成此操作,但它不是适合这项工作的工具。
让一个由 S3 创建对象事件触发的 Lambda 作业要简单得多。 AWS Docs 上甚至有一个关于(几乎)做这件事的教程。
http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html
【讨论】:
我们最终使用 Databricks 来完成所有工作。
胶水没有准备好。它返回没有意义的错误消息。我们创建了工单,等了五天仍然没有回复。
【讨论】:
S3 API 允许您执行 COPY 命令(实际上是一个带有标头以指示源 URL 的 PUT)以在存储桶内或存储桶之间复制对象。它用于定期伪造 rename()s,但您可以自己发起调用,从任何东西。
无需D/L任何数据;在同一个 S3 区域内,副本的带宽约为 6-10 MB/s。
AWS CLI cp command 可以做到这一点。
【讨论】:
您可以通过将 zip 文件从 s3 下载到 tmp/ 目录然后将其重新上传到 s3 来做到这一点。
s3 = boto3.resource('s3')
s3.Bucket(bucket_name).download_file(DATA_DIR+file,'tmp/'+file)
s3.meta.client.upload_file('tmp/'+file,bucket_name,TARGET_DIR+file)
【讨论】:
现在您可以用胶水编写 python shell 作业来完成它。只需在 Glue 作业创建向导中选择 Type 到 Python Shell。你可以在里面运行普通的python脚本。
【讨论】:
什么都不需要。我相信 aws 数据管道是一个最佳选择。只需使用命令行选项。预定运行也是可能的。我已经试过了。成功工作。
【讨论】: