如何使用弹性搜索索引 10 亿行 CSV 文件?
How to index a 1 billion row CSV file with elastic search?
假设您有一个很大的 CSV 文件 - 假设有 10 亿行。
您希望文件中的每一行都成为弹性搜索中的一个文档。
您无法将文件加载到内存中 - 它太大,因此必须进行流式处理或分块处理。
花费的时间不是问题。首要任务是确保所有数据都被索引,没有丢失数据。
您如何看待这种做法:
第 1 部分:准备数据
- 以 1k 行为一组循环遍历 CSV 文件
- 对于每个批次,将行转换为 JSON 并将它们保存到较小的文件中
- 你现在有 1m 个文件,每个文件有 1000 行 nice JSON
- 文件名应该是递增的 ID。例如,运行 从 1.json 到 1000000.json
第 2 部分:上传数据
- 开始遍历每个 JSON 文件并将其读入内存
- 使用批量 API 一次上传 1k 个文件
- 在结果数组中记录上传的success/failure
- 遍历结果数组,如果任何上传失败,重试
您上面提到的步骤看起来不错。其他一些确保 ES 不会承受负载的事情:
- 根据我的经验,您也可以将批量请求大小增加到更大的值,比如在 4k-7k 范围内的某个位置(从 7k 开始,如果它会导致疼痛,请尝试使用较小的批次,但继续低于 4k 可能不需要)。
- 确保
refresh_interval
的值设置为非常大的值。这将确保不会非常频繁地索引文档。 IMO 默认值也可以。阅读更多 here.
正如上面的评论所暗示的,如果您从较小的一批数据开始会更好。当然,如果您使用常量而不是对值进行硬编码,您的任务就会变得更容易。
假设您有一个很大的 CSV 文件 - 假设有 10 亿行。
您希望文件中的每一行都成为弹性搜索中的一个文档。
您无法将文件加载到内存中 - 它太大,因此必须进行流式处理或分块处理。
花费的时间不是问题。首要任务是确保所有数据都被索引,没有丢失数据。
您如何看待这种做法:
第 1 部分:准备数据
- 以 1k 行为一组循环遍历 CSV 文件
- 对于每个批次,将行转换为 JSON 并将它们保存到较小的文件中
- 你现在有 1m 个文件,每个文件有 1000 行 nice JSON
- 文件名应该是递增的 ID。例如,运行 从 1.json 到 1000000.json
第 2 部分:上传数据
- 开始遍历每个 JSON 文件并将其读入内存
- 使用批量 API 一次上传 1k 个文件
- 在结果数组中记录上传的success/failure
- 遍历结果数组,如果任何上传失败,重试
您上面提到的步骤看起来不错。其他一些确保 ES 不会承受负载的事情:
- 根据我的经验,您也可以将批量请求大小增加到更大的值,比如在 4k-7k 范围内的某个位置(从 7k 开始,如果它会导致疼痛,请尝试使用较小的批次,但继续低于 4k 可能不需要)。
- 确保
refresh_interval
的值设置为非常大的值。这将确保不会非常频繁地索引文档。 IMO 默认值也可以。阅读更多 here.
正如上面的评论所暗示的,如果您从较小的一批数据开始会更好。当然,如果您使用常量而不是对值进行硬编码,您的任务就会变得更容易。