如何在 Apache Ignite 中设置 OFF-HEAP 或 ON-HEAP 内存?
How to set OFF-HEAP or ON-HEAP Memory in Apache Ignite?
我有一个 8 节点集群,每个节点有 16GB 内存。以前,我使用Ignite 1.2 版本没有任何问题。最近我搬到了 2.6。现在,对于一个小数据集,它工作正常。但是对于大型数据集,每次它都会给我一个错误 "out of memory" 或 "Failed to send a message" 等。我对每个节点的 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"点燃。我已经如下配置了两个缓存(缓存 1、缓存 2)和 运行 对它们的连接查询。
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。
在目前的内存架构中(Apache Ignite 2.x,参见this link)你不能只选择堆上内存。
数据总是存储在堆外。它将被提取(虽然不是完全)到堆上以执行各种处理。例如,虽然 SQL 查询的 JOIN
和 WHERE
大部分可以在堆外完成,但最终结果集必须提取到堆上。
在您的情况下,您向 Ignire 提交的内存比您拥有的要多。你提交了 12GB off-heap + 15GB heap = 27GB,这显然比你的 16GB RAM 多。
一般来说,您应该提交足够的内存来存储堆外所需的数据(+索引和开销!),您可以将其余部分交给堆。您还应该为系统需要留出一些空闲 RAM。但是启用持久性后,您可以拥有比堆外内存更多的数据 - 但请记住,如果您的数据不适合堆外数据区域,性能将会受到影响。
顺便说一下,删除你的 pageEvictionMode
- 当持久化启用时它没有任何意义(是的,文档没有突出显示)。
最后,如果您的堆 space 得到 OutOfMemory
,这可能意味着您的 SQL 结果集太大。要解决此问题,您可以
- 通过将您的 SQL 查询分成几个返回较少数据的查询来缩小结果集
- 增加堆大小
- 使用
SqlFieldsQuery.setLazy(true)
- 有了这个标志,Ignite 将尝试将结果集拆分成块,如果可能的话,并将它们一个一个地加载到堆上
我有一个 8 节点集群,每个节点有 16GB 内存。以前,我使用Ignite 1.2 版本没有任何问题。最近我搬到了 2.6。现在,对于一个小数据集,它工作正常。但是对于大型数据集,每次它都会给我一个错误 "out of memory" 或 "Failed to send a message" 等。我对每个节点的 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"点燃。我已经如下配置了两个缓存(缓存 1、缓存 2)和 运行 对它们的连接查询。
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。
在目前的内存架构中(Apache Ignite 2.x,参见this link)你不能只选择堆上内存。
数据总是存储在堆外。它将被提取(虽然不是完全)到堆上以执行各种处理。例如,虽然 SQL 查询的 JOIN
和 WHERE
大部分可以在堆外完成,但最终结果集必须提取到堆上。
在您的情况下,您向 Ignire 提交的内存比您拥有的要多。你提交了 12GB off-heap + 15GB heap = 27GB,这显然比你的 16GB RAM 多。
一般来说,您应该提交足够的内存来存储堆外所需的数据(+索引和开销!),您可以将其余部分交给堆。您还应该为系统需要留出一些空闲 RAM。但是启用持久性后,您可以拥有比堆外内存更多的数据 - 但请记住,如果您的数据不适合堆外数据区域,性能将会受到影响。
顺便说一下,删除你的 pageEvictionMode
- 当持久化启用时它没有任何意义(是的,文档没有突出显示)。
最后,如果您的堆 space 得到 OutOfMemory
,这可能意味着您的 SQL 结果集太大。要解决此问题,您可以
- 通过将您的 SQL 查询分成几个返回较少数据的查询来缩小结果集
- 增加堆大小
- 使用
SqlFieldsQuery.setLazy(true)
- 有了这个标志,Ignite 将尝试将结果集拆分成块,如果可能的话,并将它们一个一个地加载到堆上