【问题标题】:Could we use AWS Glue just copy a file from one S3 folder to another S3 folder?我们可以使用 AWS Glue 将文件从一个 S3 文件夹复制到另一个 S3 文件夹吗?
【发布时间】:2019-08-23 20:53:56
【问题描述】:

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

非常感谢!

【问题讨论】:

  • 我也会考虑成本。一个 Glue 作业至少需要 10 分钟的运行时间,而一个 lambda 作业只需​​ 100 毫秒。

标签: amazon-s3 aws-glue


【解决方案1】:

您可以这样做,并且使用 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。

Reference: PEP on f-strings

【讨论】:

【解决方案2】:

我认为您可以使用 Glue 来做到这一点,但使用 CLI 不是更容易吗?

您可以执行以下操作:

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

【讨论】:

  • 之所以使用Glue是因为它可以是一个作业,随着作业的复杂化,可以触发其他作业。
  • 我不是 100% 确定 Glue 我们的工具。 Glue 更像是一种 ETL 工具,它可以抓取数据库以提取到 AWS。你看过数据管道吗? docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/…
  • 一位 AWS 代表最近告诉我,随着时间的推移,Data Pipeline 可能会被淘汰,转而使用 Glue ETL。不确定这有多正式,但如果我必须在它们之间做出选择,我可能会选择 Glue ETL,似乎 AWS 更有可能长期投资。
【解决方案3】:

您可以使用 Glue 完成此操作,但它不是适合这项工作的工具。

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

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

【讨论】:

    【解决方案4】:

    我们最终使用 Databricks 来完成所有工作。

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        您可以通过将 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)
        

        【讨论】:

        • 你能格式化你的答案吗,它看起来很棒。
        【解决方案7】:

        现在您可以用胶水编写 python shell 作业来完成它。只需在 Glue 作业创建向导中选择 TypePython Shell。你可以在里面运行普通的python脚本。

        【讨论】:

          【解决方案8】:

          什么都不需要。我相信 aws 数据管道是一个最佳选择。只需使用命令行选项。预定运行也是可能的。我已经试过了。成功工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-07
            • 2022-06-10
            • 2019-10-09
            • 2018-05-20
            • 1970-01-01
            • 2020-06-04
            相关资源
            最近更新 更多