본문으로 바로가기

IMDb demo 프로그램 ②

 

1. 기능

이 프로그램은 영화 목록과 영화 별점을 각각 텍스트 파일로 받고, 변수 k 를 세 번째 parameter로 받아서

평균 rating(별점) 이 가장 높은 fantasy 영화 k개의 영화제목과 평균 별점을 출력하는 기능을 가지고 있다.

 

2. movies.dat ( input 데이터 1 )

다음은 hdfs 의 movieinput 폴더 안에 들어갈 첫번째 텍스트 데이터이고, 한줄씩 Map의 input으로 전달된다.

영화ID::영화제목(개봉년도)::장르|장르|장르...

위와 같은 형식으로 작성되어 있다.

1::Toy Story (1995)::Animation|Children's|Comedy
2::Jumanji (1995)::Adventure|Children's|Fantasy
3::Grumpier Old Men (1995)::Comedy|Romance
4::Waiting to Exhale (1995)::Comedy|Drama
5::Father of the Bride Part II (1995)::Comedy
6::Heat (1995)::Action|Crime|Thriller
7::Sabrina (1995)::Comedy|Romance
8::Tom and Huck (1995)::Adventure|Children's
9::Sudden Death (1995)::Action
10::GoldenEye (1995)::Action|Adventure|Thriller
11::American President, The (1995)::Comedy|Drama|Romance
12::Dracula: Dead and Loving It (1995)::Comedy|Horror
13::Balto (1995)::Animation|Children's
14::Nixon (1995)::Drama
15::Cutthroat Island (1995)::Action|Adventure|Romance
16::Casino (1995)::Drama|Thriller
17::Sense and Sensibility (1995)::Drama|Romance
...

 

3. ratings.dat ( input 데이터 2 )

다음은 hdfs 의 movieinput 폴더 안에 들어갈 두번째 텍스트 데이터이고, 한줄씩 Map의 input으로 전달된다.

유저ID::영화ID::별점::XXX(기타정보)

위와 같은 형식으로 작성되어 있다.

1::1193::5::978300760
1::661::3::978302109
1::914::3::978301968
1::3408::4::978300275
1::2355::5::978824291
1::1197::3::978302268
1::1287::5::978302039
1::2804::5::978300719
1::594::4::978302268
1::919::4::978301368
1::595::5::978824268
1::938::4::978301752
1::2398::4::978302281
1::2918::4::978302124
1::1035::5::978301753
...

 

4. output.dat ( output 데이터 )

hdfs의 movieoutput 폴더 하위에 생성될 출력파일이다.

다음과 같이 fantasy 장르의 영화 중 별점 상위  k개의 영화 제목(개봉년도)와 평점이 적혀 있어야 한다.

세부 예시는 실제 출력 결과와 다를 수 있으며, 세번째 인자 k에 따라 출력되는 영화의 갯수가 달라진다.

Jumanji (1995) 4.8
...

 

5.  Map -  Join작업

우리는 영화에 관한 유저평점 데이터가 필요하다.

Map 에서는 우선 movies 와 ratings 를 Join 하는 작업을 해야 한다.

( 이때 key는 두 데이터를 묶을 수 있는 "영화ID" 로 한다. )

 

1) setup에서 fileName 을 받아와서 현재 처리중인 데이터의 파일이 movies인지 rating인지 구분한다.

2) 만약 movies 라면, key는 영화ID, value는 "M" + 영화제목(개봉년도) 로 하여 context.write() 하여 reduce로 보낸다. ( 이때, fantasy 장르가 아니면 넘어간다 )

3) 만약 ratings 라면, key는 영화ID, value는 "R" + 평점 으로 하여 context.write() 한다.

(value 앞에 붙는 "M" 과 "R" 은 추후 reduce 에서 데이터를 구분하기 위한 식별자 역할을 한다.)

 

6. shuffle (Hadoop engine 에서 자동으로 수행 - 직접 작성하지 않음)

Map에서 영화ID가 key로 넘어왔기 때문에 Hadoop engine에서 같은 영화 ID를 갖는 데이터들을 모은다.결국 (key, [value]) 쌍은 (영화ID, [영화제목(개봉년도), 평점1, 평점2...] 이런 형태로 이루어진다.(각 value의 순서는 무작위로 뒤섞일 수 있다)

 

 7. Reduce - topK 추리기

앞서 Map에서 두 데이터를 합치는 작업을 했다.

Reduce에서는 이 데이터들을 차례대로 읽어들여서 평균 별점을 계산하고 상위 K개의 데이터만을 emit 하는 topK 작업을 해야 한다.

 

1) 데이터 처리를 위해 Movie class를 생성한다. (필드 : String name, String rating)

2) main함수에서 conf.setInt 를 이용하여 topK 변수를 설정한다. ( 입력 시 3번째 argument로 설정 )

3) setup 메소드에서 conf.getInt를 이용하여 topK변수를 가져온다. ( topK 변수는 몇위까지 출력할 것인가를 결정 )

또한, setup에서 PriorityQueue를 하나 생성한다.

4) reduce 함수로 돌아와서 앞서 붙여놓은 "M" 과 "R" 식별자를 이용하여 이것이 영화 제목인지 아니면 별점인지 구분한다. (StringTokenizer)

5) 만약 M이면, Movie class의 name에 저장한다.

6) 만약 R이면, 별점을 합산한다.

7) 루프가 끝나면 합산한 별점을 전체 별점의 갯수로 나누어 평점을 구한다.

8) 평점을 rating에 저장하고 insertQueue를 수행한다.

9) cleanup함수에서 랭크 K의 범위를 벗어난 데이터를 remove 한다.

 

8. 소스코드

내용

 


참고자료

반응형