将大数据从 PostgreSQL 导出到 AWS s3[英] Export big data from PostgreSQL to AWS s3

本文是小编为大家收集整理的关于将大数据从 PostgreSQL 导出到 AWS s3的处理方法,想解了将大数据从 PostgreSQL 导出到 AWS s3的问题怎么解决?将大数据从 PostgreSQL 导出到 AWS s3问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我在 PostgreSQL 数据库中有大约 10TB 的数据.我需要将此数据导出到 AWS S3 存储桶中.

我知道如何导出到本地文件,例如:

CONNECT DATABASE_NAME;
COPY (SELECT (ID, NAME, ADDRESS) FROM CUSTOMERS) TO ‘CUSTOMERS_DATA.CSV WITH DELIMITER '|' CSV;

但我没有 10TB 大小的本地驱动器.

如何直接导出到 AWS S3 存储桶?

推荐答案

在导出大型数据转储时,您最关心的应该是减少故障.即使您可以使 GB 网络连接饱和,移动 10 TB 数据也需要 24 小时以上.您不想因为失败(例如数据库连接超时)而重新启动它.

这意味着您应该将导出分成多个部分.您可以通过向副本内的 select 语句添加一个 ID 范围来完成此操作(我刚刚编辑了您的示例,因此可能存在错误):

COPY (SELECT (ID, NAME, ADDRESS) FROM CUSTOMERS WHERE ID BETWEEN 0 and 1000000) TO ‘CUSTOMERS_DATA_0.CSV WITH DELIMITER '|' CSV;

当然,您可以用一个简短的程序生成这些语句;不要忘记更改每个输出文件的名称.我建议选择一个 ID 范围,为每个输出文件提供 1 GB 左右的空间,从而产生 10,000 个中间文件.

您在哪里编写这些文件取决于您.如果 S3FS 足够可靠,我认为这是一个好主意.

通过将卸载分成多个较小的部分,您还可以将其划分到多个 EC2 实例中.您可能会在只有少数读者的情况下使数据库机器的带宽饱和.另请注意,AWS 对跨可用区数据传输收取每 GB 0.01 美元的费用——10TB 为 100 美元——因此请确保这些 EC2 机器与数据库机器位于同一可用区.

这也意味着您可以在数据库不忙时(即在正常工作时间之外)执行卸载.

最后,这意味着您可以测试您的流程,您可以修复任何数据错误,而无需运行整个导出(或为每个修复处理 10TB 的数据).

在导入端,Redshift 可以加载多个文件并行.这应该会改善您的整体时间,尽管我不能说具体多少.

一个警告:使用清单文件而不是对象名称前缀.我遇到过 S3 的最终一致性导致文件在加载过程中丢失的情况.

其他推荐答案

您可以将程序的输出通过管道传输到 s3,如下所示:

cat "hello world" | aws s3 cp - s3://some-bucket/hello.txt

我对 postgresql 的经验并不丰富,但据我所知,以下内容应该可行:

psql -U user -d DATABASE_NAME -c "Copy (Select ID, NAME, ADDRESS From CUSTOMERS) To STDOUT With CSV HEADER DELIMITER ',';" | aws s3 cp - s3://some-bucket/CUSTOMERS_DATA.csv.gz

本文地址:https://www.itbaoku.cn/post/1763949.html