elasticsearch 索引时使用弹性搜索解决内存问题,elasticsearch,indexing,lucene,elasticsearch,Indexing,Lucene" /> elasticsearch 索引时使用弹性搜索解决内存问题,elasticsearch,indexing,lucene,elasticsearch,Indexing,Lucene" />

elasticsearch 索引时使用弹性搜索解决内存问题

elasticsearch 索引时使用弹性搜索解决内存问题,elasticsearch,indexing,lucene,elasticsearch,Indexing,Lucene,我有3个16GB的节点(aws elasticsearch服务)运行弹性搜索服务。我已将我的ES配置为具有3个碎片和2个副本。这3个节点负责数据的索引和数据的查询和获取 所有3个的堆分配都是7GB 数据分为两个指数,index1和index2。Index1没有太多数据,文档大小也很小。Index2是较重的索引,但其中的最大文档大小也是1MB 但是,在为index2的某些文档编制索引时,其中一个ES实例多次抛出OutOfMemoryException。我检查了碎片内存,index2中总共有3.5

我有3个16GB的节点(aws elasticsearch服务)运行弹性搜索服务。我已将我的ES配置为具有3个碎片和2个副本。这3个节点负责数据的索引和数据的查询和获取

所有3个的堆分配都是7GB

数据分为两个指数,index1和index2。Index1没有太多数据,文档大小也很小。Index2是较重的索引,但其中的最大文档大小也是1MB

但是,在为index2的某些文档编制索引时,其中一个ES实例多次抛出OutOfMemoryException。我检查了碎片内存,index2中总共有3.5 GB的文档数据

我无法找出原因,并在调试问题时寻求帮助

该文件的结构类似于:

    {  
        "name":"ABC",
        "class":10,
        "school":"XYZ",
        "subjects":[  
               {  
                  "A":{  
                  "name":"subject a",
                  "marks":80,
                  "passed":true
                  }
               },
               {  
                 "B":{  
                   "name":"subject B",
                   "marks":76,
                   "passed":true
               }
            }
        ]
      }
“主题”键中的数组长度最多可达3000

使用的ES版本为5.1.0

在下面找到堆栈跟踪:

[2017-07-28T15:44:13,912][WARN ][o.e.m.j.JvmGcMonitorService] [obLzpwI] [gc][849973] overhead, spent [26s] collecting in the last [26.1s]
[2017-07-28T15:44:13,895][WARN ][o.e.t.n.Netty4Transport  ] [obLzpwI] exception caught on transport layer [[!!!io.netty.channel.socket.nio.NioSocketChannel@650b7925=>java.lang.OutOfMemoryError:Compressed class space!!!]], closing connection
org.elasticsearch.ElasticsearchException: java.lang.OutOfMemoryError: Compressed class space
    at org.elasticsearch.transport.netty4.Netty4Transport.exceptionCaught(Netty4Transport.java:326) [transport-netty4-5.1.2.jar:5.1.2]
    at org.elasticsearch.transport.netty4.Netty4MessageChannelHandler.exceptionCaught(Netty4MessageChannelHandler.java:84) [transport-netty4-5.1.2.jar:5.1.2]
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:296) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.notifyHandlerException(AbstractChannelHandlerContext.java:861) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:375) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293) [netty-codec-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:280) [netty-codec-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:396) [netty-codec-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:248) [netty-codec-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:129) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:651) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:536) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:490) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:450) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873) [netty-common-4.1.6.Final.jar:4.1.6.Final]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: java.lang.OutOfMemoryError: Compressed class space

您正在耗尽压缩的类空间,而不是堆内存。这可以使用
-XX:CompressedClassSpaceSize=1g
(作为示例值)进行配置

你可以在甲骨文的文档中读到更多关于这一点的信息,从底部算起

然而,这很可能只是治疗症状


上面所描述的一些旧版本的elastic存在已知问题。这个特定的问题是由为每个请求编译一个唯一的脚本引起的。如果这听起来与您的问题相关,那么可能值得使用触发异常的实际API调用更新您的答案

您正在运行哪个ES版本?你能在日志中给我们完整的堆栈跟踪吗?文档是如何索引的(如果您可以显示一个小片段)?您的群集的设置是什么?你的索引是什么?@asettouf用堆栈跟踪和示例文档更新了这个问题。在索引设置中,您到底在寻找什么?主要是“设置”:{“索引”:{“映射”:{“总计字段”:{“限制”:“200000000”}},“刷新间隔”:“1s”,“碎片数”:“3”,“最大结果窗口”:“200000”,}}除此之外,还有自定义的分析器和标记器。非常感谢。它确实奏效了。我可能已经发现了这个问题。我们的系统中有很多动态脚本,这可能导致了这个问题。还有一件事,我如何确定CompressedClassSpaceSize的最佳值?@Aayushi虽然增加CompressedClassSpaceSize在短期内会起作用,但解决根本问题(动态脚本消耗内存)要好得多。在这种情况下,我真的只考虑把这个价值变成一个购买你的方法。尽管如此,我不知道还有什么比反复试验更好的方法来获得正确的值。