2016-08-15 1 views
0

아파치 점화를 사용하여 선호도 컴퓨터 데이터 정렬을 수행 할 수 있습니다. 다음 두 예제에서는 예상대로 작동합니다.노드 당 캐시 된 데이터에서 작동

// 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' 이벤트를 수신하고 그에 따라 반응 할 수 있습니다. –

관련 문제