빅데이터 하둡 프로그래밍 교육과정] 보조 정렬(Secondary Sort)
빅데이터 하둡 프로그래밍 교육과정] 보조 정렬(Secondary Sort)
실무개발자를위한 실무교육 전문교육센터학원
www.oraclejava.co.kr에 오시면 보다 다양한 강좌를 보실 수 있습니다.
보조 정렬(Secondary Sort)
- 항공 운항 데이터 분석 결과를 보면 ‘월’의 순서가 제대로 처리되지 않았음
: 1 10 11 12 2 3 의 순서로 처리되어있음
: Key값이 연도와 월이 합쳐진 하나의 문자열로 인식되었기 때문
- 보조정렬
: Key의 값들을 그룹핑하고, 그룹핑된 레코드에 순서를 부여하는 방식
: 1. 기존 key의 값들을 조합한 복합키(composit key)를 정의. 이 때 키 값 중 어떤 키를 그룹핑 키로 사용할지 결정
: 2. 복합키의 레코드를 정렬하기 위한 비교기(Comparator)를 정의
: 3. 그룹핑 키를 파티셔닝할 파티셔너(Partitioner)를 정의
:4. 그룹핑 키를 정렬하기 위한 비교기(Comparator)를 정의
- Task: 항공 운항 지연 데이터의 결과를 월 순서로 정렬하기
: 복합키의 연도를 그룹키로 사용 연도별로 그룹핑된 데이터들은 월의 순서대로 정렬
1. 복합키 구현
: 복합키란 기존 키값을 조합한 일종의 키 집합 클래스
: 현재까지의 출력key는 단순한 하나의 문자열
: 복합키를 적용하면 연도와 월이 각각 멤버 변수로 정의됨
: WritableComparable 인터페이스
- 파라미터는 바로 자신인 DateKey로 설정
- 여기엔 세가지 메서드가 구현되어 있어야 함
- readFields : 입력스트림에서 연도와 월을 조회
- write: 출력스트림에 연도와 월을 출력
- compareTo : 복합키와 복합키를 비교해서 순서 정할 때 사용
: 연도는 string타입, 월은 integer타입 & setter와 getter 메서드를 함께 구현해야 함
: tostring 메서드를 호출하여 출력 양식을 구현하여 값을 출력
- 정의하지 않으면 자바에서 사용하는 클래스 식별자가 출력됨
2. 복합키 비교기 구현
: 복합키의 정렬 순서를 부여하기 위한 클래스
: 두 개의 복합키를 비교하며 각 멤버변수를 비교해 정렬순서를 정함
: WritableComparator를 상속받아 비교기 구현
- compare 메서드 : 기본으로 객체를 스트림에서 조회한 값을 비교하게 되므로 정확한 정렬 순서 반영하지 못함. 그래서 이 메서드를 재정의해서 멤버 변수를 비교하는 로직을 구현해야 함
: compare 메서드에서 파라미터로 전달받은 객체 w1, w2를 DateKey에서 선언한 멤버변수를 조회하기 위해 DateKey클래스로 변환함 ( DateKey k1 = (DateKey) w1; )
:연도 값 비교
- String 클래스에서 제공하는 compareTo 메서드 사용하여
- ‘k1 == k2’일 때 ‘0’, ‘k1 > k2’일 때 ‘1’, ‘k1 < k2’일 때 ‘-1’임. 이건 compareTo 메서드에 정의되어 있는것
- Year에 대해선 같은 연도 안에서 월의 순서가 정렬되어야 하니까, 일치하기만 하면 월의 정렬을 하는 코드로 이동!
- 실제 연도 값을 정렬하는건 ‘그룹키 비교기’에서 함
: 월 값 비교
- ‘k1 == k2’일 때 ‘0’, ‘k1 > k2’일 때 ‘1’, ‘k1 < k2’일 때 ‘-1’ 을 똑같이 이용하여 오름차순으로 정렬
- 월 값은 integer이므로 compareTo 메서드를 사용하는게 아니라 수동으로 규칙을 입력하여 정렬
3. 그룹키 파티셔너 구현
: 파티셔너는 맵 태스크의 출력데이터를 리듀스 태스크의 입력 데이터로 보낼지 결정함
: 이렇게 파티셔닝된 데이터는 맵태스크의 출력 데이터의 key, value값에 따라 정렬됨
: 그룹핑 키로 사용하는 연도에 대한 파티셔닝을 수행함
: Partitioner를 상속받아 구현해야함
- 두 개의 파라미터는 mapper 출력데이터의 key와 value
- getPartition 메서드로 파티셔닝 번호를 조회하고, 재정의해서 구현 후 연도에 대한 해시코드를 조회해 파티션 번호생성
4. 그룹키 비교기 구현
: 같은 연도에 해당하는 모든 데이터를 하나의 REDUCER 그룹에서 처리할 수 있음
: 복합키 비교기처럼 WritableComparator를 상속받아 클래스 선언
- 위의 네 가지의 job을 적용하여 매퍼와 리듀서를 작성함
- 문제사항: 리듀서에서 count를 합산할 경우 데이터에 오류 발생(171p)
: 2008년도 데이터를 처리할 때, 2008년 12월만 출력되고, 카운트는 2008년 모든 카운트가 합 산되어 출력됨
: 그 이유는 year정보인 그룹키를 기준으로 연산을 수행하기 때문
: 이를 해결하기 위해 복합키를 구분해서 처리해야 하고, 그를 위한 것으로 백업month (bMonth)를 이용해서 데이터를 나누어야 함
: bMonth와 현재 들어온 key.getMonth()를 비교해서 일치하지 않으면 bMonth의 카운트를 출력하는 방식
: 다음 순서의 월의 카운트를 합산하기 위해 sum변수를 0으로 초기화함
'빅데이터 > 빅데이터Hadoop' 카테고리의 다른 글
빅데이터 하둡 프로그래밍 교육과정] 전체 정렬(Total Sort) (0) | 2018.03.04 |
---|---|
빅데이터 하둡 프로그래밍 교육과정] 부분 정렬(Partial Sort) (0) | 2018.03.04 |
빅데이터 하둡 프로그래밍 교육과정] 체인 (0) | 2018.03.04 |
빅데이터 하둡 프로그래밍 교육과정] ToolRunner (0) | 2018.03.04 |
빅데이터 하둡 프로그래밍 교육과정] Tool (0) | 2018.03.04 |