【问题标题】:How to load data from S3 to PostgreSQL RDS如何将数据从 S3 加载到 PostgreSQL RDS
【发布时间】:2017-11-21 00:29:53
【问题描述】:

我需要将数据从 S3 加载到 Postgres RDS(大约 50-100 GB)我没有使用 AWS Data Pipeline 的选项,我正在寻找类似于使用 COPY 命令加载数据的东西S3 到 Amazon Redshift。

如果有任何关于如何完成此任务的建议,我将不胜感激。

【问题讨论】:

    标签: postgresql amazon-s3 amazon-rds


    【解决方案1】:

    最初,这个答案试图使用 S3 到 Postgres RDS 功能。整个企业都失败了(见下文)。

    我终于能够做到这一点的方法是:

    1. 设置安装了 psql 的 EC2 实例(见下文接近尾声)
    2. 复制相关 CSV 文件以从 S3 导入到本地实例
    3. 使用 psql /copy 命令导入文件

    最后一部分非常非常重要。如果您使用 SQL COPY 命令,整个 RDS Postgres 角色结构将使您感到沮丧。它有一个不稳定的 SUPERRDSADMIN 角色,一点也不超级。但是,如果您使用 psql /copy commany,您显然可以做任何事情。我已经确认是这种情况并已成功开始我的上传。我会回来重新编辑这篇文章(时间允许),为上述内容添加相关文档步骤。

    Caveat Emptor: 下面的帖子是我为实现此功能所做的所有原始工作。尽管付出了很多努力(包括只能被描述为来自 AWS 的可悲技术支持),但我不想掩盖领先地位。我不相信这个功能已经准备好迎接黄金时间。尽管测试环境非常简单,易于复制,但 AWS 并没有提供一种有效的方法来避免复制语句如下所示:

    aws_s3.table_import_from_s3(...) 的实际调用报告了RDS 和S3 之间的权限问题。根据我对psql 的研究工作,这似乎是一个 C 库,可能由 AWS 安装。

    注意:CURL 错误代码:尝试验证预签名 URL 时出现 28 次,剩余 1 次尝试 注意:提示:确保您的实例能够与 S3 连接。

    现已添加 S3 到 Postgres RDS 功能

    AWS 于 2019 年 4 月 24 日发布了允许 Postgres RDS 直接从 S3 加载的功能。您可以阅读公告here,并查看文档页面here

    我与 OP 分享,因为这似乎是 AWS 支持的解决问题的方式。

    关键总结点:

    • 需要 Postgres 11.1 或更高版本
    • 需要访问 psql 并能够将其连接到 RDS 实例
    • 需要安装aws_s3 扩展,它会引入aws_commons
    • 您可以通过指定凭证或将 IAM 角色分配给 RDS 来访问 S3 存储桶
    • 它宣传支持所有与 postgres COPY 命令相同的数据格式
    • 目前它似乎一次只支持一个文件(即不支持正则表达式)

    这些说明相当详细,并提供了多种配置路径(AWS CLI 脚本、控制台说明等)。此外,使用您的 IAM 密钥而不是必须设置角色的选项也不错。

    我没有找到只下载 psql 的方法,所以我不得不将完整的 postgres 安装到我的 mac,但这对 brew 没什么大不了的:

    brew install postgres

    而且由于数据库服务没有被激活,它是获取 psql 的最快方法。

    更新:决定在我的 mac 上安装 psql 是一个安全漏洞、端口转发等。我发现AMI Extras rubric 下有一个简单的 Postgres 安装可用于 AMI Linux 2。对于您的 ami 实例类型,安装命令相当简单。

    sudo amazon-linux-extras install postgresql10

    psql 相当容易使用,然而,重要的是要记住,任何对psql 本身的指令都会被\ 转义。 psql 上的文档可以在 here 找到。建议在执行 AWS 推荐的脚本之前至少检查一次。

    如果您运行严格的安全性并且可以访问您的 RDS 实例受到严格限制(我这样做),请不要忘记打开从运行 Postgres 的 AMI 实例到您的 RDS 实例的端口。

    如果您的偏好是 GUI,那么您可以尝试使用 PGAdmin4。根据文档,这是 AWS 推荐的连接 RDS Postgres 实例的方式。我无法让任何 SSH 隧道功能工作(这就是为什么我最终做了我用于 psql 的 localhost SSH 映射)。我还发现它在其他方面相当有问题。阅读产品评论,似乎第 4 版可能不是最稳定的版本。

    【讨论】:

    • 有人在使用psql=> CREATE EXTENSION aws_s3 CASCADE; 命令安装aws_s3 时遇到问题吗?我得到:ERROR: could not open extension control file "/usr/share/postgresql/11/extension/aws_s3.control": No such file or directory。在正确安装这些方面,我似乎找不到太多帮助。
    【解决方案2】:

    http://docs.aws.amazon.com/redshift/latest/dg/t_loading-tables-from-s3.html

    使用 COPY 命令从数据文件中并行加载表 亚马逊 S3。您可以使用 Amazon 指定要加载的文件 S3 对象前缀或使用清单文件。

    使用前缀指定要加载的文件的语法如下 如下:

    copy <table_name> from 's3://<bucket_name>/<object_prefix>'
    authorization;
    

    更新

    另一个选项是挂载 s3 并使用 COPY 命令使用 csv 的直接路径。我不确定它是否能有效地容纳 100GB,但值得一试。 Here is some list 的软件选项。

    另一种选择是将 s3 文件逐部分“解析”with something described here 到一个文件,COPY 来自命名管道 described here

    最明显的选择是将文件下载到本地存储并使用COPY 我根本不介绍

    还值得一提的是s3_fdw(状态不稳定)。 Readme 非常简洁,但我假设您可以创建一个指向 s3 文件的外部表。这本身意味着您可以将数据加载到其他关系...

    【讨论】:

    • 感谢您的反馈。但是,我需要将数据从 S3 加载到 Postgres RDS,而不是 Redshift。所以,“复制”命令对我不起作用。
    • 我对“将 S3 中的数据加载到 Amazon Redshift 中的 COPY 命令”感到困惑。 - 我想你可以从“已安装”的 s3 驱动器复制到 postgres
    • @Raj 用一些选项更新了答案。每个都需要一些努力或时间 - 但这就是我们拥有的 atm
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2018-10-29
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多