将 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 时忽略所有无效记录