2016-08-15 6 views
0

私はapache igniteを使用してアフィニティのコンピュータデータコロケーションを実行できます。次の2つの例では、期待どおりに動作します。ノードごとにキャッシュされたデータを操作する

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

ただし、すべてのノードデータに対してラムダを実行したいとします。たとえば、私はすべての人のために、Amazonからのすべての注文をキャッシュしていたと言います。私は総額が誰の注文であるかを知りたい。

おそらく例がありませんが、ドキュメントによれば、これを行う方法はわかりません。私が見た例では、計算したいキーを指定する必要があります。この例では、すべてのノードでいくつかのラムダを実行できるようにするため、各ノードはデータの独自のシェアでしか動作しません。

私はこの

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'イベントを待ち受けて、それに応じて反応することができます。 –

関連する問題