批量插入与单插入

时间:2014-10-10 15:59:42

标签: elasticsearch bulkinsert

管理我们的ES集群的主要开发人员声明单个文档加载到ES只会为我们提供大约每秒30/40的创建。而批量操作将为我们提供1,000+以上的更多。我意识到批量总是更快(或通常),并且任何过程都存在硬件/环境限制。但是,对于其他技术,您不需要为单次插入支付如此高的代价。对于ES来说,我显然是无知的。为什么要为ES中的文档写入付出这么高的代价?或者我们还没有得到适当的通知?

环境:

  • Apache Storm写入我们的ES群集
  • 目前,所有写入都是在批量操作中处理的。

2 个答案:

答案 0 :(得分:2)

您需要考虑的是装载机和群集之间的往返时间。设置http连接,传输数据,然后等待响应可能需要一段时间 - 在这种情况下,它似乎需要大约30毫秒。 Elasticsearch必须为您的请求设置解析器,将其交给真正开展工作的节点,然后将响应生成给您。

通过使用批量API,您可以来回移除大量内容 - ES可以将插入到同一节点的插入组合在一起,不必为每个请求实例化新的解析器等。

单个请求的HTTP连接池会有所帮助,但从长远来看,批量插入/更新/删除总是会更快。

答案 1 :(得分:0)

批量索引确实更快,但它没有系统管理员建议的那么糟糕。在过去的两年里,Elasticsearch在这方面做得更好。

我们每秒可以执行数百次插入/更新而不会出现批量请求。大多数插入大约需要1毫秒(包括发送http请求和接收响应)。如果插入速度成为问题,则可以退出群集刷新(默认为1秒)。此外,您可以使用多个线程插入。批量插入可以在10000s的范围内,具体取决于映射的复杂程度。

您肯定需要http连接池(在愤怒中使用任何类型的Web服务时都是如此),甚至更好,运行嵌入式elasticsearch节点。另一种方法是,如果您不想执行嵌入式节点,则在localhost上运行elasticsearch节点。这样,所有http流量都在localhost上。

最后,如果需要支持更多并发写入,则可以始终增加分片和节点的数量。这些数字并非一成不变。如果每秒需要数万次写入,则应该可以设计可以执行此操作的集群。它可能需要大量的调整和硬件,你应该不这样做,除非你有充分的理由这样做。但是,弹性搜索的重点是水平可伸缩性。