ES启动时内存设置超过2G时,聚合查询报错


QQ截图20170829170924.png


QQ截图20170829171107.png

配置及查询如附件,是还需要改什么配置么?
已邀请:

kennywu76 - wood@Ctrip

赞同来自: kepmoving learnonly

这个报错是因为ES里的BytesStreamOutput有长度限制,不能超过Integer.MAX_VALUE,也就是2GB。
  void ensureCapacity(long offset) {
if (offset > Integer.MAX_VALUE) {
throw new IllegalArgumentException(getClass().getSimpleName() + " cannot hold more than 2GB of data");
}
bytes = bigArrays.grow(bytes, offset);
}

也就是说date histogram内嵌stats aggs计算过程中,有一处输出的字节流长度超过上限。最好看一下出错时ES服务端日志,根据出错时的JAVA堆栈,看一下是哪个调用抛出来的,以便定位到问题根源。
 
timestamp和millis的数据类型需要看一下,是否会引起load fielddata。 如果timestamp和millis的字段类型配置无误的话,这个聚合看起来没啥问题。安全起见,检查一下timestamp里是否存在脏数据。  我们以前遇到过一例脏数据引起的问题,  一条不正确的时间戳数据写进来,导致聚合的时间范围超长,产生海量的bucket而出错。

Cheetah

赞同来自: learnonly

聚合时会将数据拉到fielddata中来,是一个纯内存的操作,这里是通过indices.fielddata.cache.size限制的,默认是不限制
你所说你堆内存分配超过2G,但是这2G并不能全部用来fielddata,还有Segment Memory、Filter Cache、Bulk Queue、Indexing Buffer等好几个内存消耗专家,所以你这里最好的办法是将要聚合的字段设置为doc_values
 

要回复问题请先登录注册