我们可以使用 AWS Glue 将文件从一个 S3 文件夹复制到另一个 S3 文件夹吗?

Could we use AWS Glue just copy a file from one S3 folder to another S3 folder?

我需要将压缩文件从一个 AWS S3 文件夹复制到另一个文件夹,并希望将其设为计划的 AWS Glue 作业。我找不到这样一个简单任务的例子。如果您知道答案,请帮忙。答案可能在 AWS Lambda 或其他 AWS 工具中。

非常感谢!

我认为您可以使用 Glue 来完成,但是使用 CLI 不是更容易吗?

您可以执行以下操作:

aws s3 sync s3://bucket_1 s3://bucket_2

您可以使用 Glue 执行此操作,但它不是完成这项工作的正确工具。

让 Lambda 作业由 S3 创建对象事件触发要简单得多。 AWS Docs 上什至有一个关于(几乎)做这件事的教程。

http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html

我们最终使用 Databricks 来做所有事情。

胶水还没准备好。它 returns 没有意义的错误消息。我们创建了工单并等待了五天仍然没有回复。

您可以将 zip 文件从 s3 下载到 tmp/ 目录,然后将其重新上传到 s3。

s3 = boto3.resource('s3')

下载文件到本地spark目录tmp:

s3.Bucket(bucket_name).download_file(DATA_DIR+file,'tmp/'+file)

从本地 spark 目录上传文件 tmp:

s3.meta.client.upload_file('tmp/'+file,bucket_name,TARGET_DIR+file)

S3 API 允许您执行 COPY 命令(实际上是带有 header 的 PUT 以指示源 URL)以在存储桶内或存储桶之间复制 objects。它用于定期伪造 rename(),但您可以从任何地方自己发起调用。

不需要D/L任何数据;在同一 S3 区域内,副本的带宽约为 6-10 MB/s。

AWS CLI cp command 可以做到这一点。

您可以这样做,并且可能有使用 AWS Glue 的原因:如果您已链接 Glue 作业并且 glue_job_#2 在成功完成 glue_job_#1 时触发。

下面的简单 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.

Reference: PEP on f-strings

现在您可以在 glue 中编写 python shell 作业来完成它。只需 select Type 在 Glue job Creation 向导中到 Python Shell。您可以在其中 运行 正常 python 脚本。

不需要任何内容​​。我相信 aws 数据管道是最好的选择。只需使用命令行选项。预定运行也可以。我已经试过了。成功工作。