Какова хорошая конфигурация для Apache вычислений Ignite Grid с OutOfMemoryError? - PullRequest
0 голосов
/ 03 марта 2020

Я хотел бы использовать функциональность Grid-вычислений Apache Ignite, но у меня проблема с пространством кучи Java (OutOfMemoryError), когда я запускаю свою программу на двух узлах. Чтобы проиллюстрировать проблему, я предлагаю простую программу, которая подсчитывает количество слов в строке:

try (Ignite ignite = Ignition.start("C:/Apache-Ignite/config/test-config.xml")) {
    IgniteCompute compute = ignite.compute();
    String[] elements = "Count characters using callable".repeat(10000).split(" ");
    Collection<IgniteCallable<Integer>> calls = new ArrayList<>();
    Arrays.stream(elements).forEach(word -> calls.add((IgniteCallable<Integer>) word::length));

    IgniteReducer<Integer, Integer> reducer = new IgniteReducer<>() {
        private Integer sum = 0;
        @Override
        public boolean collect(Integer integer) {
            sum += integer;
            return true;
        }
        @Override
        public Integer reduce() {
            return sum;
        }
    };

    IgniteFuture<Integer> result = compute.callAsync(calls, reducer);
    System.out.println("Result : " + result.get());
}

и файл test-config. xml file:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="peerClassLoadingEnabled" value="true"/>
<property name="dataStorageConfiguration">
    <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
        <!-- Redefining the default region's settings -->
        <property name="defaultDataRegionConfiguration">
            <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                <property name="name" value="Default_Region"/>
                <!-- Initial size. -->
                <property name="initialSize" value="#{2L * 1024 * 1024 * 1024}"/>
                <!-- Maximum size. -->
                <property name="maxSize" value="#{2L * 1024 * 1024 * 1024}"/>
            </bean>
        </property>
    </bean>
</property>
</bean>
</beans>

введите описание изображения здесь
Когда я наблюдаю кучу во время выполнения программы, мы ясно видим, что куча достигает своего предела. Может быть, сборщик мусора заблокирован, но я не знаю.

Кроме того, если я запускаю свою программу на одном локальном узле (начиная с Ignition.start("...")), у меня нет проблем.

1 Ответ

0 голосов
/ 05 марта 2020

Я только что перепробовал ваш случай, и кажется, что производительность callAsync() становится все хуже и хуже, когда calls.size() проходит мимо 5000. В вашем случае это ~ 40000, поэтому вы не увидите завершения этого вызова даже если это не вызывает OOM.

Пожалуйста, не забудьте разделить ваши вычисления в пакетах ~ 1000 вызовов. На самом деле рекомендуется, чтобы вычислительная работа была существенной, в вашем случае вы все равно будете тратить 99% ресурсов, распределяя задания и их аргументы.

Тем не менее, я подам заявку об этом поведении.

...