尝试将 bulk/ingest "large" 数量的文档 SQL Db 到 Elasticsearch
Trying bulk/ingest "large" amount of documents SQL Db to Elasticsearch
您好,我需要从我的数据库中读取多个表并连接这些表。加入表后,我想将它们推送到 Elasticsearch。
这些表是从外部进程连接的,因为数据可能来自多个来源。这不是问题,事实上我有 3 个单独的进程以平均每秒 30,000 条记录读取 3 个单独的表。这些记录被连接到一个多映射中,然后为每个键生成一个 JsonDocument。
然后有一个单独的进程读取非规范化的 JsonDocuments 并将它们以平均每秒 3000 个文档的速度批量传输到 Elasticsearch。
我在寻找拆分工作的方法时遇到了麻烦。我很确定我的 Elasticsearch 集群每秒可以处理超过 3000 个文档。我在想以某种方式拆分包含 Joined json 文档的多图。
无论如何,我正在为此构建自定义应用程序。所以我想知道是否有任何工具可以组合在一起来完成所有这些工作?是某种形式的 ETL,还是流处理之类的?
虽然流式处理比批量处理更容易获得记录,并且会减少 java 容器中有关大型对象管理的开销,但您可能会遇到延迟问题。通常在这种情况下,您必须找到批量大小的最佳值。在此我遵循以下步骤:
1) 构建流式批量插入(因此流式传输但仍然获得超过 1 条记录(或者在您当时的情况下构建超过 1 JSON)
2) 尝试几种批量大小:例如 10,100,1000,10000 并将它们绘制成快速图表。 运行 足够数量的记录以查看性能是否不会随着时间的推移而下降:可能是每条记录 10 非常快,但是存在增量插入开销(例如 [=22 中的情况) =]服务器上的主键维护)。如果你 运行 每次测试的总记录数相同,它应该能代表你的表现。
3) 在你的图表中进行插值,并可能在 运行 2
的最佳值之间尝试 3 个值
然后使用最终结果作为您的最佳流批量插入大小。
获得此值后,您可以再添加一个步骤:
运行 多个进程并行。然后,这会填补您处理过程中的空白。观察吞吐量并可能再调整一次批量大小。
这种方法曾经帮助我将多 TB 的导入过程从 2 天加速到大约 12 小时,因此效果非常好。
您好,我需要从我的数据库中读取多个表并连接这些表。加入表后,我想将它们推送到 Elasticsearch。
这些表是从外部进程连接的,因为数据可能来自多个来源。这不是问题,事实上我有 3 个单独的进程以平均每秒 30,000 条记录读取 3 个单独的表。这些记录被连接到一个多映射中,然后为每个键生成一个 JsonDocument。
然后有一个单独的进程读取非规范化的 JsonDocuments 并将它们以平均每秒 3000 个文档的速度批量传输到 Elasticsearch。
我在寻找拆分工作的方法时遇到了麻烦。我很确定我的 Elasticsearch 集群每秒可以处理超过 3000 个文档。我在想以某种方式拆分包含 Joined json 文档的多图。
无论如何,我正在为此构建自定义应用程序。所以我想知道是否有任何工具可以组合在一起来完成所有这些工作?是某种形式的 ETL,还是流处理之类的?
虽然流式处理比批量处理更容易获得记录,并且会减少 java 容器中有关大型对象管理的开销,但您可能会遇到延迟问题。通常在这种情况下,您必须找到批量大小的最佳值。在此我遵循以下步骤:
1) 构建流式批量插入(因此流式传输但仍然获得超过 1 条记录(或者在您当时的情况下构建超过 1 JSON) 2) 尝试几种批量大小:例如 10,100,1000,10000 并将它们绘制成快速图表。 运行 足够数量的记录以查看性能是否不会随着时间的推移而下降:可能是每条记录 10 非常快,但是存在增量插入开销(例如 [=22 中的情况) =]服务器上的主键维护)。如果你 运行 每次测试的总记录数相同,它应该能代表你的表现。 3) 在你的图表中进行插值,并可能在 运行 2
的最佳值之间尝试 3 个值然后使用最终结果作为您的最佳流批量插入大小。
获得此值后,您可以再添加一个步骤: 运行 多个进程并行。然后,这会填补您处理过程中的空白。观察吞吐量并可能再调整一次批量大小。
这种方法曾经帮助我将多 TB 的导入过程从 2 天加速到大约 12 小时,因此效果非常好。