2016-08-15 51 views
0

我能夠使用apache點火來實現親和性計算機數據配置。在以下兩個示例中,它按預期工作。對每個節點的緩存數據進行操作

// 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)); 
    }); 

但是,我想對所有的節點數據運行lambda。比如說,我已經緩存了每個人,他們所有的來自亞馬遜的訂單。我想知道每個人的訂單總金額是多少。

我可能只是想念一個例子,但根據文檔我看不到如何做到這一點。在我見過的例子中,我必須指定我想要計算的鍵。在這個例子中,我只是希望能夠在所有節點上執行一些lambda,每個節點只在它自己的數據份額上運行。

我試着這樣做

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」事件並做出相應的反應。 –

相關問題