java - 尝试批量/摄取 "large"数量的文档 SQL Db 到 Elasticsearch

标签 java elasticsearch etl

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

这些表是从外部进程连接的,因为数据可以来自多个源。这不是问题,事实上我有 3 个单独的进程以平均每秒 30,000 条记录的速度读取 3 个单独的表。这些记录被连接到一个多重映射中,然后为每个键生成一个 JsonDocument。

然后有一个单独的进程读取非规范化的 JsonDocuments 并将它们以平均每秒 3000 个文档的速度批量传输到 Elasticsearch。

我在寻找分配工作的方法时遇到了麻烦。我非常确定我的 Elasticsearch 集群每秒可以处理超过 3000 个文档。我在想以某种方式分割保存连接的 json 文档的多重映射。

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

最佳答案

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

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

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

获得此值后,您可以再添加一个步骤: 并行运行多个进程。这会稍微填补您流程中的空白。观察吞吐量并可能再调整一次批量大小。

这种方法曾经帮助我将多 TB 的导入过程从 2 天缩短到大约 12 小时,因此效果非常好。

关于java - 尝试批量/摄取 "large"数量的文档 SQL Db 到 Elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35689223/

相关文章:

java - 在hdfs上从Amplab-shark到Cassandra运行查询

elasticsearch - 在kibana中合并多个日志行

Python:为什么 PostgreSQL 表中的列名用双引号引起来?

java - Apache NiFi : programmatically stop the Custom Processor

sql-server - 如何完成ETL任务?

java - Android/Java 理解我何时能够使用/覆盖变量

java - 乒乓球游戏 - 为球动画添加计时器

java - (JAVA) 将用户输入的单词与文本文件中包含的另一个单词进行比较

elasticsearch - elasticsearch多字段查询未按预期工作

java - 使用JEST进行分析API调用