我有一个8节点群集,每个群集都有16GB RAM。以前,我使用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万条记录。我尝试了多种方法,甚至使用了堆选项。但是大型数据集的联接操作给我一个错误。但是对于较小的数据集,它工作得很好。任何人都可以帮助我为群集配置ON-HEAP或OFF-HEAP。
答案 0 :(得分:3)
在当前的内存架构(Apache Ignite 2.x,请参见this link)中,您不能仅选择堆上内存。
数据始终存储在堆中。它将被提取(尽管不完全)到堆上以执行各种处理。例如,虽然SQL查询的JOIN
和WHERE
通常可以在堆外完成,但最终结果集必须提取到堆上。
对于您来说,您为Ignire分配的内存比您要多。您提交了12GB的堆外+ 15GB的堆= 27GB,这显然比您的16 GB RAM多。
通常,您应该只分配足够的内存来存储堆外所需的数据(+索引和开销!),您可以将其余的分配给堆。您还应该留出一些RAM来满足系统需求。但是启用持久性后,您可以拥有比堆外内存更多的数据-但是请记住,如果您的数据不适合堆外数据区域,则会影响性能。
顺便说一下,删除您的pageEvictionMode
-启用持久性后,它没有任何意义(是的,文档无法突出显示该内容)。
最后,如果堆空间得到OutOfMemory
,则可能意味着您的SQL结果集太大。要解决此问题,您可以
SqlFieldsQuery.setLazy(true)
-带有此标志的Ignite将尝试将结果集拆分为多个块(如果可能的话),并将它们逐个加载到堆中