如何在Apache Ignite中设置OFF-HEAP或ON-HEAP内存?

时间:2018-10-24 20:24:19

标签: ignite

我有一个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。

1 个答案:

答案 0 :(得分:3)

在当前的内存架构(Apache Ignite 2.x,请参见this link)中,您不能仅选择堆上内存。

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

对于您来说,您为Ignire分配的内存比您要多。您提交了12GB的堆外+ 15GB的堆= 27GB,这显然比您的16 GB RAM多。

通常,您应该只分配足够的内存来存储堆外所需的数据(+索引和开销!),您可以将其余的分配给堆。您还应该留出一些RAM来满足系统需求。但是启用持久性后,您可以拥有比堆外内存更多的数据-但是请记住,如果您的数据不适合堆外数据区域,则会影响性能。

顺便说一下,删除您的pageEvictionMode-启用持久性后,它没有任何意义(是的,文档无法突出显示该内容)。

最后,如果堆空间得到OutOfMemory,则可能意味着您的SQL结果集太大。要解决此问题,您可以

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