2014-10-10 42 views
1

管理我们的ES集群的主要开发人员声明单个文档加载到ES只会为我们每秒提供大约30/40个创作。而批量操作将给我们更多的范围在1,000+以上。我意识到批量总是更快(或通常),并且任何进程都有硬件/环境约束。但是,使用其他技术,您不会为单次插入付出如此沉重的代价。当谈到ES时,我显然无知。为什么在ES中为文档写入付出如此沉重的代价?或者我们只是没有得到适当的通知?大容量插件vs单插件

环境:

  • 阿帕奇风暴写入到我们的ES集群
  • 目前所有的写操作的批量操作处理。

回答

2

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

利用大宗原料药,你免去很多来回 - ES可以组合在一起插片将在同一个节点,没有实例为每个请求一个新的解析器等

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

+0

谢谢@Alcanzar,这是有道理的。我是ES新手,所以我很欣赏这些反馈。 – scarpacci 2014-10-10 22:50:59

+1

嗨@scarpacci,我在风暴和ES上做了一些工作。也许这可以帮助你。 [风暴三叉戟-elasticsearch](https://github.com/fhussonnois/storm-trident-elasticsearch)。 – fhussonnois 2014-10-13 21:37:06

+0

谢谢@fhuz我会看看。 – scarpacci 2014-10-16 04:13:31

0

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

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

您绝对需要http连接池(在使用任何类型的webservice时为true)或甚至更好,请运行嵌入式elasticsearch节点。另一种方法是在本地主机上运行elasticsearch节点,如果您不想执行嵌入式节点。这样,所有的http流量都在本地主机上。

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