我有一个 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。
在当前的内存架构(Apache Ignite 2.x,请参阅此链接)中,您不能仅选择堆内存。
数据总是存储在堆外。它将被(尽管不是完全地)提取到堆上以执行各种处理。例如,虽然SQL 查询的JOIN和WHERE大部分可以在堆外完成,但最终结果集必须提取到堆上。
在您的情况下,您向 Ignire 提交的内存比您拥有的要多。你提交了 12GB 堆外 + 15GB 堆 = 27GB,这显然比你的 16GB RAM 多。
通常,您应该提交足够的内存来在堆外存储您需要的数据(+ 索引和开销!),其余的可以交给堆。您还应该为系统需要保留一些可用的 RAM。但是启用持久性后,您可以获得比堆外内存更多的数据 - 但请记住,如果您的数据不适合堆外数据区域,性能将受到影响。
顺便说一句,删除您的pageEvictionMode- 当启用持久性时它没有意义(是的,文档未能突出显示)。
最后,如果你OutOfMemory的堆空间得到一个,这可能意味着你的 SQL 结果集太大了。要解决此问题,您可以
SqlFieldsQuery.setLazy(true)- 如果可能的话,Ignite 将尝试将结果集拆分为多个块,并将它们一一加载到堆中| 归档时间: |
|
| 查看次数: |
1960 次 |
| 最近记录: |