首页 > 解决方案 > 自动将数据从 S3 加载到 Redshift

问题描述

我也想将数据从 S3 加载到 Redshift。每秒大约 5MB{近似大小} 的数据进入 S3。

我需要自动将数据从 S3 加载到 Redshift。到 S3 的数据是从 kafka-stream 消费者应用程序转储的。

文件夹 S3 数据位于文件夹结构中。示例文件夹: bucketName/abc-event/2020/9/15/10

此文件夹中的文件:

abc-event-2020-9-15-10-00-01-abxwdhf。5MB

abc-event-2020-9-15-10-00-02-aasdljc。5MB

abc-event-2020-9-15-10-00-03-thntsfv。5MB

S3 中的文件具有用下一行分隔的 json 对象。

此数据需要加载到redshift 中的 abc-event表中。

我知道一些选项,例如AWS Data pipelineAWS GlueAWS Lambda Redshift loader ( https://aws.amazon.com/blogs/big-data/a-zero-administration-amazon-redshift-database-loader/ )。

最好的方法是什么。如果有人会指导我,我真的很感激。谢谢

==============================================

感谢普拉巴卡尔的回答。在继续这方面需要一些帮助。

通过爬虫在数据目录中创建一个表,然后在胶水中运行 ETLL 作业,完成将数据从 S3 加载到 redshift 的工作。

我正在使用方法 1. 谓词下推 新文件在不同分区的 S3 中加载(新的小时开始。)

我正在使用 AWS Glue python 脚本作业添加新分区。使用 Athena API 在表中添加新分区。(使用 ALTER TABLE 添加分区)。

我已经在控制台中检查了 python 脚本作业添加了新分区。我检查了新分区是否已添加到数据目录表中。

当我使用下推谓词运行相同的作业时,给出由 python 脚本粘合作业添加的相同分区。

该作业没有将新分区中的 S3 中的新文件加载到 Redshift。

我不知道我做错了什么???

标签: amazon-web-servicesamazon-s3aws-lambdaamazon-redshift

解决方案


在您的使用案例中,您可以利用 AWS Glue 定期将数据加载到 redshift 中。您可以使用触发器安排您的 Glue 作业每 60 分钟运行一次,在您的案例中计算大约为 1.8 GB。

可以根据您的需要以及每次运行要处理的数据量来更改此间隔。

在阅读这些数据时,您可以采用以下几种方法:

  1. 谓词下推

这只会加载作业中提到的分区。您可以即时计算每次运行的分区值并将它们传递给过滤器。为此,您需要在每次运行时运行 Glue 爬虫,以便在表元数据中更新表分区。

如果您不想使用爬虫,那么您可以使用 boto3 create_partition或 Athena add partition,这将是一个免费操作。

  1. 工作书签

这将仅加载从 Glue 作业完成上一次运行时累积的最新 s3 数据。如果在某些运行中没有在 S3 中生成数据,则此方法可能无效。

计算出要读取的数据后,您只需在每次运行时将其写入红移表即可。

在您的情况下,您需要启用子目录中的文件,recurse如下面的语句所示。

datasource0 = glueContext.create_dynamic_frame.from_catalog(database =<name>, table_name = <name>, push_down_predicate = "(year=='<2019>' and month=='<06>')", transformation_ctx = "datasource0", additional_options = {"recurse": True})

推荐阅读