如何在ApacheIgnite中设置堆外或堆上内存?

如何在ApacheIgnite中设置堆外或堆上内存?,ignite,Ignite,我有一个8节点的集群,每个集群都有16GB的RAM。以前,我使用Ignite 1.2版本没有任何问题。最近我转到了2.6。现在,对于一个小数据集,它工作得很好。但对于大型数据集,每次都会出现“内存不足”或“无法发送消息”等错误。我对每个节点的Ignite配置如下: <property name="defaultDataRegionConfiguration"> <bean class="org.apache.ignite.configuration.DataRegion

我有一个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);
RendezvousAffinityFunction affFunc=新的RendezvousAffinityFunction();
affFunc.setExcludeNeights(真);
affFunc.setPartitions(1024);
CacheConfiguration cache1=新的CacheConfiguration(EMP_CACHE);
cache1.setIndexedTypes(Long.class、EMP.class);
cache1.setSqlFunctionClasses(EMPFunctions.class);
cache1.setCacheMode(CacheMode.PARTITIONED);
cache1.setAffinity(affFunc);

我最大的数据集包含超过400万条记录。我尝试了很多方法,甚至使用了on-heap选项。但是,使用大数据集进行连接操作时会出现错误。但是对于一个较小的数据集,它工作得很好。任何人都可以帮助我为集群配置堆上或堆外内存。

在当前的内存体系结构(Apache Ignite 2.x,请参阅)中,您不能仅选择堆上内存

数据总是存储在堆外。它将被提取(尽管不是完全)到堆上以执行各种处理。例如,虽然SQL查询的
JOIN
WHERE
大部分可以在堆外完成,但最终结果集必须提取到堆上

在你的情况下,你要点燃的内存比你拥有的要多。您提交12GB堆外+15GB堆=27GB,这显然比您的16GB RAM要多

一般来说,您应该提交足够的内存来存储堆外所需的数据(+索引和开销!),其余的内存可以交给堆。您还应该留出一些RAM以满足系统需要。但是,启用持久性后,您可以拥有比堆外内存更多的数据,但是请记住,如果您的数据不适合堆外数据区域,那么性能将受到影响

顺便说一下,删除您的
pageexecutionmode
——当启用持久性时,它没有任何意义(是的,文档没有突出显示)

最后,如果您的堆空间得到一个
OutOfMemory
,这可能意味着您的SQL结果集太大。为了解决这个问题,你可以

  • 通过将SQL查询拆分为多个返回较少数据的查询,使结果集更小
  • 增加堆大小
  • 使用
    SqlFieldsQuery.setLazy(true)
    -如果可能,Ignite将尝试将结果集拆分为块,并将它们逐个加载到堆中

谢谢您的建议。如何将SQL查询拆分为多个查询,使其返回的数据更少?你能给我一个主意吗?