尝试批量/摄取"大" SQL Db到Elasticsearch的文档量

时间:2016-02-28 22:42:08

标签: java elasticsearch etl

您好我需要从我的数据库中读取多个表并加入表。一旦表格加入,我想将它们推送到Elasticsearch。

表格是从外部流程连接的,因为数据可以来自多个来源。这不是一个问题,实际上我有3个独立的进程读取3个独立的表,平均每秒30,000条记录。这些记录将连接到一个multimap中,然后为每个键生成一个JsonDocument。

然后有一个单独的进程读取非规范化的JsonDocuments,并以平均每秒3000个文档将它们扩展到Elasticsearch。

我试图找到分工方法的麻烦。我非常确定我的Elasticsearch集群每秒可以处理超过3000个文档。我想以某种方式拆分了包含Joined json docs的多图。

无论如何,我正为此构建自定义应用程序。所以我想知道是否有任何工具可以组合起来完成所有这些工作?某种形式的ETL,还是流处理还是什么?

1 个答案:

答案 0 :(得分:1)

虽然流式传输可以使记录更容易获得然后进行批量处理,并且可以减少java容器中有关大型对象管理的开销,但您可以对延迟产生影响。通常在这种情况下,您必须找到体积大小的最佳值。在此我按照以下步骤操作:

1)构建流式批量插入(因此流但仍然获得超过1条记录(或者在您的情况下构建超过1 JSON) 2)试验几种体积尺寸:例如10,100,1000,10000,并将它们绘制成快速图表。运行足够数量的记录以查看性能是否随着时间的推移而下降:可能是每个记录的速度非常快,但是存在增量插入开销(例如,主键维护中的SQL Server中的情况) )。如果您为每个测试运行相同数量的总记录,则应该代表您的性能。 3)在图表中插值,并可能在第2次运行的最佳值之间尝试3个值

然后使用最终结果作为最佳流批量插入大小。

获得此值后,您可以再添加一个步骤: 并行运行多个进程。这样就填补了你处理过程中的空白。观察吞吐量并再次调整您的体积大小。

这种方法曾经帮助我进行了多TB导入过程,从2天加速到大约12小时,所以它可以解决非常积极的问题。