如何使用弹性搜索索引 10 亿行 CSV 文件?

Posted

技术标签:

【中文标题】如何使用弹性搜索索引 10 亿行 CSV 文件?【英文标题】:How to index a 1 billion row CSV file with elastic search? 【发布时间】:2021-03-19 11:31:24 【问题描述】:

假设您有一个大型 CSV 文件 - 假设有 10 亿行。

您希望文件中的每一行都成为弹性搜索中的文档。

您无法将文件加载到内存中 - 它太大,因此必须进行流式传输或分块。

花费的时间不是问题。首要任务是确保所有数据都被编入索引,没有丢失数据。

您如何看待这种方法:

第 1 部分:准备数据

以 1k 行为单位循环遍历 CSV 文件 对于每个批次,将行转换为 JSON 并将它们保存到一个较小的文件中 您现在有 1m 个文件,每个文件都有 1000 行漂亮的 JSON 文件名应该是递增的 ID。比如从1.json跑到1000000.json

第 2 部分:上传数据

开始循环遍历每个 JSON 文件并将其读入内存 使用批量 API 一次上传 1k 个文档 在结果数组中记录上传的成功/失败 循环遍历结果数组,如果有任何上传失败,重试

【问题讨论】:

这是一个好的开始!先用 100K 行试试,看看会发生什么。 你也可以使用logstash来做到这一点,它会处理你提到的一切。 【参考方案1】:

您上面提到的步骤看起来不错。确保 ES 不会承受负载的其他几件事:

根据我的经验,您也可以将批量请求大小增加到更大的值,例如在 4k-7k 范围内(从 7k 开始,如果它会引起疼痛,请尝试使用较小的批次,但要低于4k 可能不需要)。 确保refresh_interval 的值设置为非常大的值。这将确保文档不会被非常频繁地编入索引。 IMO 默认值也可以。阅读更多here。

正如上面的评论所暗示的,如果你从小批量的数据开始会更好。当然,如果您使用常量而不是硬编码值,您的任务就会变得更容易。

【讨论】:

@TomDane 你执行了吗?您遇到过哪些值得分享的障碍?

以上是关于如何使用弹性搜索索引 10 亿行 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将弹性搜索索引的响应保存到 s3 存储桶中

使用弹性搜索设计搜索服务

如何将弹性搜索索引或日志从一个弹性搜索服务器复制到另一台?

logstash 输出带有序列号的弹性搜索索引

弹性搜索如何索引嵌套列表

使用 NEST C# 在弹性搜索中使用多个索引进行全文搜索