이제 Infinispan에는 어떤 흥미로운 Data가 저장되어 있다. 우리는 그것을 이용하여 어떤 computation을 수행할 것이다. Every country별로 평균 온도를 계산해보자. 한가지 단순한 접근법은 하나의 node에서 전체 dataset에 대해 반복하여 computation을 수행하는 것이다. 하지만 여기에는 두가지 불리한 면이 있다. 첫번째는 각각의 owner로부터 data fetch가 필요하다는 것이다. (빠른 메모리 대신에 느린 network을 통해서 데이터를 가져와야 함). 두번째는 전체 cluster에 배치된 node가 아닌 하나의 node의 마력만 이용한다는 것이다. 얼마나 낭비인가!
Infinispan은 두가지 문제에 대한 해결책을 제시한다. 분산 처리와 map/reduce에 대한 강력한 개념을 사용하여 모든 node에서 locally computation을 수행할 수 있다. 그리고 작업 수행 결과를 master node에 보내서 작업 수행 결과를 aggregation한다. Average country temperature를 계산하기 위해서 어떻게 map/reduce를 사용할 수 있는지 살펴보자.
첫째로 every entry를 호출하고, computation을 수행하고, 그 결과를 돌려주는 method인 mapper가 필요하다. 우리의 경우에는 "computation"이 각 entry의 country와 temperature를 추출하고 그 정보들을 collector로 보낸다.
public class CountryTemperatureMapper implements Mapper<String, LocationWeather, String, Float> {
@Override
public void map(String key, LocationWeather value, Collector<String, Float> collector) {
collector.emit(value.country, value.temperature);
}
}
위의 코드는 각 entry에 대해서 local에서 실행될 것이다. Mapper 선언의 Generic type은 input key/value와 output key/value의 pair를 나타낸다. 특히, 우리는 location/weather pair를 처리하여 country/temperature pair를 return할 것이다. Collector는 동일한 output key에 속한 모든 값을 aggregate하고, reducer에 그것을 전달할 것이다.
public class CountryTemperatureReducer implements Reducer<String, Float> {
@Override
public Float reduce(String reducedKey, Iterator<Float> i) {
int count = 0;
float sum = 0f;
while(i.hasNext()) {
++count;
sum += i.next();
}
return sum / count;
}
}
Reducer는 각 output key에 대해서 수집된 value를 호출할 것이다. 우리의 경우에는 모든 값을 더해서 ("temperatures") 평균을 내기 위해 count로 나눴다. 끝났다!(that's it!) 한번 실행해 보자.
git checkout -f step-10
mvn clean package exec:exec # from terminal 1
mvn exec:exec # from terminal 2
[Coordinator Output]
---- Average country
temperatures ----
Average temperature in Canada is -11.0° C
Average temperature in USA is 5.8° C
Average temperature in Romania is 7.0° C
Average temperature in UK is 3.0° C
Average temperature in Italy is 5.5° C
Average temperature in Portugal is 13.6° C
Average temperature in Switzerland is -0.1° C
이제 우리는 우리가 제품에서 실행하고 싶은 실제 작업 수행에 유용한 기능을 가진 전체적으로 동작하는 application을 가지게 되었다. 이제 조금 더 간단하게 environment에서 configuration을 변경하는 방법에 대해서 다음 단계에서 알아보자.
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/677