将 s3 中跨 CSV 文件的数十亿条记录推送到 MongoDb

Posted

技术标签:

【中文标题】将 s3 中跨 CSV 文件的数十亿条记录推送到 MongoDb【英文标题】:Push billions of records spread across CSV files in s3 to MongoDb 【发布时间】:2019-02-19 16:22:44 【问题描述】:

我有一个 s3 存储桶,每天可以获取近 14-150 亿条记录,分布在 26000 个 csv 文件中。

我需要解析这些文件并将其推送到 mongo db。

以前只有 50 到 1 亿条记录,我在 ec2 实例中使用具有多个并行进程的批量 upsert,这很好。但是由于记录数量急剧增加,以前的方法效率不高。

那么最好的方法是什么?

【问题讨论】:

每天都有数十亿条新记录。您的 mongodb 集群的规格是什么。是否已充分配置,并有一些备用容量? @SergioTulentsev 我只需要一天的数据,之后我放弃了集合。此外,尽管有数十亿的数据,但只有 1 亿个文档,因为我正在更新相同的 _id。一个文档可能有多达 200 个 json,被推送到一个数组中 无论数据的寿命要求如何,磁盘(spinning rust 或 ssd)每秒只能承受有限的写入次数。很可能是,对于 1000 倍的数据大小,根本就没有足够的磁盘。 您能更新一下您采用的方法吗? @GVSandeep我使用了多线程的方式,我启动了一个AWS实例(大的32核)并启动了32个线程,每个线程处理数据并推送到mongo。请记住,我们的 mongo 实例也很大,可以处理这种负载 【参考方案1】:

你应该看看mongoimport,它是用GoLang编写的,可以有效地利用线程来并行上传。它非常快。您必须在上传之前将文件从 S3 复制到本地磁盘,但如果您将节点与 S3 存储桶和数据库放在同一区域,它应该可以快速运行。此外,您可以使用MongoDB Atlas 及其API 在加载时调高集群上的 IOPS,然后将其调低以加快上传速度。

【讨论】:

我不认为它会起作用,因为对于具有相同 id 的记录,我想更新相同的 docuemtn 并将一些数据推送到它的数组。并非所有数据都是文档。即使有数十亿条记录,最终也只有大约 1 亿条文档, 好的。在这种情况下,我会预先拆分数据并运行并行程序。对于大型数据集,这总是比多线程方法更有效。

以上是关于将 s3 中跨 CSV 文件的数十亿条记录推送到 MongoDb的主要内容,如果未能解决你的问题,请参考以下文章

处理数十亿条记录的推荐数据库类型

如何使用mongo在sinatra的handsontable中轻松加载数十亿条记录?

将数据从 s3 复制到 redshift 时忽略所有无效记录

如何将保存到S3的文件推送到前端进行下载?

Firebase 实时数据库能否有效地循环浏览数十亿条帖子并由发布它们的用户检索?

第20篇-不和谐如何索引数十亿条消息