Как настроить память OFF-HEAP или ON-HEAP в Apache Ignite? - PullRequest
0 голосов
/ 24 октября 2018

У меня кластер из 8 узлов, каждый из которых имеет 16 ГБ ОЗУ.Раньше я без проблем использовал версию 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».Я настроил два кэша (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);

Мой самый большой набор данных содержит более 4 миллионов записей.Я пробовал разными способами, даже с опцией включения в кучу.Но операция объединения с большим набором данных выдает ошибку.Но для меньшего набора данных, это просто отлично работает.Любой, кто поможет мне настроить ON-HEAP или OFF-HEAP для моего кластера.

1 Ответ

0 голосов
/ 24 октября 2018

В текущей архитектуре памяти (Apache Ignite 2.x, см. эта ссылка ) вы не можете выбрать только память в куче.

Данные всегда хранятся в выключенном состоянии.-heap.Он будет извлечен (хотя и не полностью) в кучу для выполнения всех видов обработки.Например, в то время как JOIN и WHERE SQL-запроса в основном могут выполняться прямо в куче, окончательный набор результатов должен быть извлечен в кучу.

В вашем случае вывыделять больше памяти для воспламенения, чем у вас есть.Вы выделяете 12 ГБ вне кучи + 15 ГБ кучи = 27 ГБ, что, очевидно, больше, чем ваша 16 ГБ ОЗУ.

В общем случае вы должны выделять достаточно памяти для хранения необходимых вам данных (+ индексы и накладные расходы!)на куче, и вы можете дать остальное в кучу.Вы также должны оставить немного оперативной памяти для системных нужд.Но при включенном постоянстве вы можете иметь даже больше данных, чем память вне кучи, но имейте в виду, что если ваши данные не помещаются в область данных вне кучи, производительность будет снижаться.

Кстати,удалите ваш pageEvictionMode - он не имеет смысла, когда постоянство включено (да, документация не может это подчеркнуть).

Наконец, если вы получите OutOfMemory для пространства кучи, это, вероятно, означает, что ваш SQLнабор результатов слишком велик.Чтобы обойти это, вы можете либо

  • уменьшить набор результатов, разбив ваш SQL-запрос на несколько, возвращая меньше данных
  • увеличить размер кучи
  • использовать SqlFieldsQuery.setLazy(true)- с этим флагом Ignite попытается разбить результирующий набор на куски, если это возможно, и загрузить их в кучу один за другим
...