我有一个8节点的集群,每个集群都有16 an内存.以前,我使用过Ignite 1.2版本,没有任何问题。最近我搬到了2.6。现在,对于一个小的数据集,它工作得很好。但对于大型数据集,每次它都会给我“内存不足”或“未能发送消息”等错误。我对每个节点的Ignite配置如下:
<property name="defaultDataRegionConfiguration">
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
<property name="initialSize" value="#{500 * 1024 * 1024}"/>
<property name="maxSize" value="#{12L * 1024 * 1024 * 1024}"/>
<property name="pageEvictionMode" value="RANDOM_2_LRU"/>
<property name="persistenceEnabled" value="true"/>
<property name="metricsEnabled" value="true"/>
</bean>
</property>我使用"Ignite.sh -Xmx15g -Xms15g“在每个节点上运行Ignite。我在下面配置了两个缓存(cache1,cache2),并对它们运行了一个连接查询。
RendezvousAffinityFunction affFunc = new RendezvousAffinityFunction();
affFunc.setExcludeNeighbors(true);
affFunc.setPartitions(1024);
CacheConfiguration<Long, EMP> cache1 = new CacheConfiguration<>(EMP_CACHE);
cache1.setIndexedTypes(Long.class, EMP.class);
cache1.setSqlFunctionClasses(EMPFunctions.class);
cache1.setCacheMode(CacheMode.PARTITIONED);
cache1.setAffinity(affFunc);我最大的数据集包含超过400万条记录。我尝试了很多种方法,即使是堆上的选项。但是,使用大型数据集的联接操作会给我带来一个错误。但对于较小的数据集,它只是工作正常。任何人都可以帮助我为我的集群配置堆上或堆外。
发布于 2018-10-24 20:53:41
在当前内存体系结构(ApacheIgnite2.x,请参阅此链接)中,您不能只选择堆上内存。
数据总是存储在off堆上。它将被取到堆上(虽然不是完全)来执行各种处理。例如,虽然SQL查询的JOIN和WHERE大部分可以在off堆中完成,但最终的结果集必须被取到堆中。
在你的例子中,你对Ignire的记忆比你所拥有的要多。您可以提交12 GB的离堆+15 GB的堆=27 GB,这显然比您的16 GB内存还要多。
通常,您应该提交足够的内存来存储数据(+索引和开销!)你需要离开堆,你可以把剩下的交给堆。您还应该为系统需求留出一些RAM。但是,通过启用持久性,您可以拥有比堆外内存更多的数据--但是请记住,如果数据不适合堆外数据区域,那么性能将受到影响。
顺便说一句,删除您的pageEvictionMode --当启用持久性时,它没有任何意义(是的,文档没有突出显示这一点)。
最后,如果您获得堆空间的OutOfMemory,这可能意味着您的SQL结果集太大了。为了解决这个问题,你可以
SqlFieldsQuery.setLazy(true) -如果可能的话,Ignite将尝试将结果集分割成块,并将它们一个接一个地加载到堆中。https://stackoverflow.com/questions/52977420
复制相似问题