弹性搜索批量上传随着时间的推移变慢
Elastic search bulk upload slows over time
我正在将海量数据集从动态导出到弹性搜索。
以下是步骤:
- 从SQL获取数据(我正在使用entity framework)。让我们将主要类型命名为联系人。
- 然后我按定义的大小对数据进行分组并序列化它们。
- 根据 ES Docs
批量上传数据格式
- 调用HttpPost并将数据发送到ES Endpoint。
我正在大量记录所需时间和任何错误。
一切正常,我的导出在一个小时内导出了数据。
也就是说,我观察到 HttpPost 的响应时间不断增加。我已经寻找了任何我可能有的内存泄漏或任何我应该处理但没有处理的东西。我想确保它以后不会困扰我。
那么,响应时间增加的可能原因有哪些?
我应该如何调查这个问题?
我使用 ES 1.7,我使用类似的场景索引了大约 1000 万个文档。
根据我的经验,如果你用力推动 ES,它会变慢,有时会因 OutOfMemory 异常而失败。
不知道是不是新版本的问题。
恕我直言,这是因为 ES 需要一些时间来处理批量 - 它接受数据,对其进行索引,但之后它会做一些后台工作来优化索引。
为了克服这个问题,我尝试了参数:单个块大小 (N)、索引块之间的睡眠时间 (S1) 以及几个 (M) 个块之间的更长时间睡眠 (S2)。
对于我的数据集和我的硬件,我以 N=5000、S1=1s、M=10、S2=10s 结尾。
为了选择安全值,我观察了 CPU、内存和 I/O 的用法。例如,I/O 长时间使用增加可能表明 ES 很快就会崩溃。
我敢肯定它非常依赖于你拥有的硬件,尤其是给 ES 尽可能多的内存!
我正在将海量数据集从动态导出到弹性搜索。 以下是步骤:
- 从SQL获取数据(我正在使用entity framework)。让我们将主要类型命名为联系人。
- 然后我按定义的大小对数据进行分组并序列化它们。
- 根据 ES Docs 批量上传数据格式
- 调用HttpPost并将数据发送到ES Endpoint。
我正在大量记录所需时间和任何错误。
一切正常,我的导出在一个小时内导出了数据。
也就是说,我观察到 HttpPost 的响应时间不断增加。我已经寻找了任何我可能有的内存泄漏或任何我应该处理但没有处理的东西。我想确保它以后不会困扰我。
那么,响应时间增加的可能原因有哪些? 我应该如何调查这个问题?
我使用 ES 1.7,我使用类似的场景索引了大约 1000 万个文档。 根据我的经验,如果你用力推动 ES,它会变慢,有时会因 OutOfMemory 异常而失败。 不知道是不是新版本的问题。
恕我直言,这是因为 ES 需要一些时间来处理批量 - 它接受数据,对其进行索引,但之后它会做一些后台工作来优化索引。
为了克服这个问题,我尝试了参数:单个块大小 (N)、索引块之间的睡眠时间 (S1) 以及几个 (M) 个块之间的更长时间睡眠 (S2)。 对于我的数据集和我的硬件,我以 N=5000、S1=1s、M=10、S2=10s 结尾。 为了选择安全值,我观察了 CPU、内存和 I/O 的用法。例如,I/O 长时间使用增加可能表明 ES 很快就会崩溃。
我敢肯定它非常依赖于你拥有的硬件,尤其是给 ES 尽可能多的内存!