2016-08-15 1 views
0

Я могу сделать сродство компьютерных данных коллокацией с apache ignite. В следующих двух примерах он работает так, как ожидалось.Работает на кэшированных данных на узел

// Works on all nodes 
    IgniteUtil.getIgnite().compute().broadcast(() -> { 
     System.out.println("Should happen on all nodes"); 
     cache.get(key).forEach(x -> { 
      System.out.println(x); 
     }); 
    }); 

    // Works on just the one node 
    IgniteUtil.getIgnite().compute().affinityRun(IgniteUtil.CACHE_NAME, key ,() -> { 
     System.out.println("Should only happen on one node"); 
     cache.get(key).forEach(x -> System.out.println(x)); 
    }); 

Однако, я хочу запустить лямбда против всех данных узлов. Так, например, скажем, я кэшировал Для каждого человека все их приказы из Амазонки. Я хочу знать, что такое сумма доллара для всех заказов.

Возможно, мне просто не хватает примера, но, согласно документам, я не вижу, как это сделать. В примерах, которые я видел, я должен указать ключи, которые я хочу вычислить. В этом примере я просто хочу иметь возможность делать лямбда на всех узлах, причем каждый узел работает только на собственной доле данных.

Я попытался сделать это

IgniteUtil.getIgnite().compute().affinityRun(IgniteUtil.CACHE_NAME, key ,() -> { 
     System.out.println("Should only happen once per node"); 
     List<Integer> count = new ArrayList<Integer>(); 
     System.out.println("Size: " + Sets.newHashSet(cache.iterator()).size()); 
     cache.iterator().forEachRemaining(x -> {count.add(count.size());}); 
     System.out.println("Calculated Size: " + count.size()); 
     System.out.println("Values: "); 
     cache.get(key).forEach(x -> System.out.print(x)); 
     System.out.println(); 
    }); 

и это выполнить только на узле, который имеет ключ, однако, размер кэша полного размера кэша, а не только те ценности, которые являются локальными.

Любые предложения?

ответ

1

Вы можете транслировать закрытие, как в первом примере, и использовать метод IgniteCache.localEntries() для итерации по локальным данным.

+0

Опять же, спасибо! Еще одно продолжение, если бы я хотел сделать это с ошибкой, есть ли встроенный механизм для этого? Или мне нужно будет что-то реализовать, чтобы обнаружить, когда узел опускается и настраивается? –

+0

Да, вам придется корректировать, если топология изменяется в середине исполнения. Вы можете прослушивать события EVT_NODE_LEFT и EVT_NODE_FAILED и реагировать соответственно. –