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

far*_*ing 2 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>
Run Code Online (Sandbox Code Playgroud)

我使用“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);
Run Code Online (Sandbox Code Playgroud)

我最大的数据集包含超过 400 万条记录。我尝试了很多方法,甚至使用堆上选项。但是与大数据集的连接操作给了我一个错误。但是对于较小的数据集,它工作正常。任何人都可以帮助我为我的集群配置 ON-HEAP 或 OFF-HEAP。

Sta*_*nov 7

在当前的内存架构(Apache Ignite 2.x,请参阅此链接)中,您不能仅选择堆内存。

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

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

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

顺便说一句,删除您的pageEvictionMode- 当启用持久性时它没有意义(是的,文档未能突出显示)。

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

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