如何在ApacheIgnite中设置堆外或堆上内存?
我有一个8节点的集群,每个集群都有16GB的RAM。以前,我使用Ignite 1.2版本没有任何问题。最近我转到了2.6。现在,对于一个小数据集,它工作得很好。但对于大型数据集,每次都会出现“内存不足”或“无法发送消息”等错误。我对每个节点的Ignite配置如下:如何在ApacheIgnite中设置堆外或堆上内存?,ignite,Ignite,我有一个8节点的集群,每个集群都有16GB的RAM。以前,我使用Ignite 1.2版本没有任何问题。最近我转到了2.6。现在,对于一个小数据集,它工作得很好。但对于大型数据集,每次都会出现“内存不足”或“无法发送消息”等错误。我对每个节点的Ignite配置如下: <property name="defaultDataRegionConfiguration"> <bean class="org.apache.ignite.configuration.DataRegion
<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查询拆分为多个返回较少数据的查询,使结果集更小
- 增加堆大小
- 使用
-如果可能,Ignite将尝试将结果集拆分为块,并将它们逐个加载到堆中SqlFieldsQuery.setLazy(true)