Elasticsearch Bulk索引减慢速度

时间:2015-09-29 13:51:05

标签: indexing elasticsearch bulk

我在将文档索引到ElasticSearch时被阻止了。我试图将(仅)〜3.7M文档索引到ES索引中,&索引~3.4M文档(占用大约3GB磁盘空间)后,索引速率降至约10 docs / min,这非常令人担忧。

索引(错误地)只有一个碎片,我认为这可能会导致某个地方出现瓶颈。

Elasticsearch版本:1.7.1

节点配置:

  

m3.large(7.5 GB RAM,32 GB SSD存储)   
ES_Heap_size:1 GB(这是我在KOPF上看到的,它也显示堆使用情况:约100MB的~400MB)   
每个节点附带50GB EBS卷

我们正在使用TransportClient与ES进行交互。 BulkProcessor已配置为5 MB的批量大小,2分钟的刷新间隔(以避免发送数据<5 MB,我们是批量索引)&amp; 6个并发请求。 ES可以有大约10个批量请求。

在看到索引速度减慢后,我做了以下事情:

  


&gt;将群集设置更改为2&amp;的threadpool.bulk.size。 threadpool.bulk.queue_size:80。   
&gt;关闭我的索引的索引刷新。   
&gt;将number_of_replicas设置为0(之前为1)。   
&gt; indices.store.throttle.type也被设置为“none”,以避免在段合并时索引限制。

以上都没有帮助。

KOPF仪表板显示大约<14%的CPU使用率。

请帮忙。谢谢!

3 个答案:

答案 0 :(得分:2)

我曾使用Bulkprocessor并插入大约7密耳(150秒)的记录,但在ES方面的任何一点都没有观察到缓慢。 我使用了使用传输客户端在Java中实现的BulkProcessor(单线程)。其余的配置几乎相同。

如果上面的结果看起来很有意义,那么也许你可以尝试一些事情:

  1. 检查程序代码的运行时内存使用情况(正在读取/处理/写入的位置)。它可能触及最大可用内存。在Java的情况下,检查程序可用的已分配的Java堆。

  2. 尝试使用多节点配置(我在单个窗口上使用三个节点ES群集m / c)

  3. 尝试使用多个分片。 (我正在使用5个碎片)
  4. 尝试将ES堆大小增加到大约1.5 GB

答案 1 :(得分:1)

你的日志中是否有“RejectionException”?这表明队列正在填满,索引无法跟上。服务器上打开文件/连接的数量怎么样?可能值得检查用户&amp;全球限制。 关于更改threadpool.bulk.size设置。这是一个坏主意,因为默认值大多是准确的,并根据您机器上的核心数设置。 尝试使用批量大小来查看它是否设置完好。

答案 2 :(得分:0)

这是一个猜测,但是如果您直接使用bulkRequest.get()而没有BulkProcessor - 它不是设计用于循环。一些内部清理没有发生,并且客户端(!)方面的性能呈指数级恶化。有关示例,请参阅this link