[MapReduce] Example of MapReduce
하둡을 공부하기 시작하면서, 하둡을 한다는 것이 무엇을 의미하는것인지 잘 와닿지 않았다. 처음에는 일차원적으로 M/W로써의 일반적인 특성 (아키텍쳐를 이해하고 그것의 설정값들을 최적화 함으로써 성능을 극대화 시키는 것)을 생각하였다. 하지만 그것은 하둡의 주된 부분이 아니다. 하둡 기반의 프로그램을 작성한다는 것은 데이터에 따라 MapReduce를 적절히 구현하는 것이며, 이를 위해서 사전에 미리 ‘처리하고자 하는 데이터에 대한 이해’, ‘분석을 위한 기획’이 정확하게 이루어져야 한다. 그렇다면 MapReduce를 적절히 구현하는 것은 무엇일까? 여러가지 상황들을 살펴보자
1. 블로그 접속 수 집계
1) 문제상황 : 어떤 블로그 서비스에서 블로그 별 열람자 수를 확인하고자 한다.
블로그의 열람 요구는 웹 서버에 일 단위 접속 로그로 기록되어 이것을 사용한다. 접속로그에는 [접속요청한 블로그ID, 접속하는사용자IP, 유효한접근여부](blog_ID, user_IP, is_Valid) 이 있다.
블로그 접속 수 집계를 위해서는 다음과 같은 조건으로 filtering 을 수행하려고 한다.
-
조건1. 유효한 접근 만을 블로그 접속 수 집계에 포함한다.
-
조건2. 같은 사용자가 특정 블로그 내의 몇가지 기사를 이동해 가며 읽은 경우, 블로그 별 열람자수를 확인하기 위해서 1회만 세도록 한다.
2) 문제접근 : 우선 유효한 접근 만을 수집하기 위한 필터링이 필요할 것이며, 사용자가 같은 블로그를 여러번 방문하는 것을 막기위해 중복제거한다.
3) MapReduce구현: 일단 조건과 같이 2단계로 나눈다. 사실 병렬분산처리를 수행하지 않는다면 단계를 나눌 것 없이 순차적으로 하나씩 처리 가능하다.
하지만 대량의 데이터 분석으로 인한 I/O 부하가 예상되기 때문에 병렬 분산 처리를 수행해야 하며, 작업을 적절한 연산의 단위로 나누는 것이 좋다.
위와 같은 경우, 조건에 따라 첫 번째 잡에서는 유효한 접근을 고르도록하고, 두 번째 잡에서는 첫번째 연산의 결과를 이용하여 중복제거를 하자.
«JOB#1»
(a) Map : 유효한접근(is_Valid == true)이라면 blog_ID,User_IP의 [조합]을 key로 하고 value를 1로 설정한다. (이를 wordcount라고 한다) (b) Shuffle : map의 결과를 입력받아 key(blog_ID, User_IP)가 같은 데이터들을 하나의 그룹으로 집계하여, 중복을 제거한다. (c) Reduce : 집계된 데이터를 대상으로 reduce 함수가 수행되면, shuffle의 결과 key를 [분해] 하여 blog_ID, User_Ip의 형태로 key-value로 나타낸다
«JOB#2»
(d) Map : 별도로 필터링 할 것이 없음으로 입력된 blog_ID, User_IP를 기존과 같이 key-value로 유지한다. (e) Shuffle : 열람이 요구된 블로그 ID별로(key를 blog_ID로 하여) 접속한 사용자 IP 주소를 집약한다. (f) Reduce : 열람이 요구된 블로그 ID 별로 접속한 사용자 IP의 수를 세는 reduce 함수를 호출하여 이것을 key-value로 전달한다. (집합(set)에 기록된 User_IP를 count 한다..)
**" MapReduce 잡에서 필터링, 중복제거, Counter는 비교적 자주 사용되는 처리이다" **
2. 취미가 비슷한 사람들의 매칭
1) 문제상황 : SNS 사이트에서 사용자 프로필이나 사이트 내 행동 이력 등, 사용자별 속성 정보를 기록하고 있다. 이 정보를 이용하여 같은 경향을 가진 사용자를 ‘친구’로 추천하여 친밀감을 높일 수 있는 시스템을 만들고자 한다.
2) 문제접근 : 개별 사용자의 속성 정보에서 사용자 특성을 계산한다. 문제를 단순화 하기 위해 특성을 계산하는 알고리즘이 존재한다고 가정한다. 모든 사용자를 대상으로 특성을 계산 후 같은 특성을 가진 사용자들을 모아 그룹을 만든다. 같은 그룹 안에서 친구를 추천하면된다.
3) MapReduce구현 : map 함수를 통해 개인별 특성을 계산한다. 사용자는 여러개의 특성을 가질 수 있으며, 갖지 않을 수도 있다. 결과 값으로 특성별 사용자(Attribute, User)를 key-value로 한다. map의 입력이 사용자 였음으로 각 map의 결과 값은 동일한 사용자에 대한 특성 값이 결과 값으로 나타나게 된다. 이를 특성 별 사용자로 집계하기 위해서 Shuffle 단계에서는 같은 특성을 가진 중간 데이터를 모아서 특성별로 사용자의 집합이 reduce 함수에 전달된다. Reduce에서는 특성별 사용자들을 집합으로 결합하는 작업이 이루어진다.
a) map : 사용자 속성 정보로 부터 특성을 계산함. 결과로 각 사용자 별 특성값을 리턴함. 단 key 값은 특성값이고, value값이 사용자 b) Shuffle : 동일한 특성 값을 갖는 사용자들을 reduce 함수에 전달함 c) Reduce : 입력받은 동일한 특성 값을 갖는 사용자들을 집합으로 묶어 특성-사용자 집합으로 key-value를 가짐
** “Map 단계에서 키를 부여하고, Shuffle 단계에서 같은 키를 가진 데이터를 모으며, Reduce 단계에서 같은 키를 가진 데이터에 대한 처리를 수행한다” **