如何使用 ASP.NET Core 和 ElasticClient Nest 将 300 万条以上记录批量插入到 Elastic Search 中

问题描述 投票:0回答:2

我在 ASP.NET Core 控制台应用程序中使用 Nest 库从 Postgres 数据库读取数据并插入弹性搜索时遇到问题。

我的做法:

  1. 从 RedShift 获取总行数。
  2. 针对 RedShift 进行约 100,000 条查询。
    • 再次将 100,000 行分成 10 十次,就像 100,000/10,000
    • 向 ES 中批量插入约 10,000 条记录。
  3. 进行下一个查询,偏移+100,000。

它可以进行 9 或 10 次迭代,但有时在 ES 中会失败。

而且这个过程需要很长时间,我说的只是 Elastic 搜索插入时间。

错误:

由于配置的 HttpClient.Timeout 已过 60 秒,请求被取消

TimeoutException:操作被取消。

IOException:无法从传输连接读取数据:由于线程退出或应用程序请求,I/O 操作已中止..

SocketException:由于线程退出或应用程序请求,I/O 操作已中止。

谁能帮我解决这个问题,并告诉我如何成功地将 10 多万条记录插入到 Elastic Search 中?

c# postgresql elasticsearch amazon-redshift nest
2个回答
0
投票

我不确定问题是否与您的解决方案中的其他内容有关,但这对我有用:

var chunks = item.Items.Chunk(5000);

foreach (var chunk in chunks)
{
    await nestClient.BulkAsync(x => x.Index(item.Index).UpdateMany(chunk, (y, z) => y.IdFrom(z, true).Doc(z).Id(z.Id).RetriesOnConflict(2)));
}

您可能想检查您的客户端(我的客户端)上最需要的超时:

 ConnectionSettings settings = new ConnectionSettings(pool)<other settings>.RequestTimeout(TimeSpan.FromMinutes(3))

0
投票

减小批量的大小,因为 10000 可能太大。通常的大小是 1000。这实际上取决于您的硬件和 Elasticsearch 集群配置,但显然如果您遇到问题,您应该减少批量大小。

建立索引时,将索引上的副本数设置为 0,并将刷新间隔设置为 -1。这样,Elasticsearch 完全致力于为您的数据建立索引,它不会花费资源来复制数据或合并段。

© www.soinside.com 2019 - 2024. All rights reserved.