- 카운터
- 카운터는 잡의 품질통제, 또는 응용프로그램 수준 통계를 제공하므로 문제 진단을 하는데 유용하게 사용됨
- 내장 카운터
- 태스크 카운터는 태스크트래커와 잡트래커로 수집됨
- 태스크 카운터는 변경 수치가 아니라 누적 수치임
- 맵리듀스 프레임워크
- 맵 입력/출력 레코드, 맵 생략된 레코드, 맵 입력/출력 바이트, 컴바인 입력/출력 레코드, 리듀스 입력 그룹, 리듀스 입력/출력 레코드, 리듀스 생략된 그룹, 리듀스 생략된 레코드, 스필드 레코드
- 파일시스템
- 파일시스템 읽은 바이트, 파일시스템 바이트
- 잡 카운터
- 잡트래커가 관리하는 항목이므로 태스크로부터 전송되지 않음
- 실행도니 맵/리듀스 태스크, 실패한 맵/리듀스 태스크, 데이터-로컬 맵 태스크, 랩-로컬 맵 태스크, 다른 로컬 맵 태스크
- 310P 내장 카운터 표 참조
- 사용자 정의 자바 카운터
- 맵리듀스 코드 수준에서 카운터의 집합과 증가 방식을 정의할 수 있음
- 정적 카운터 그룹은 enum으로, 카운터는 enum의 field로 정의됨
- 리소스번들을 이용하여 카운터 출력 시 읽기 좋도록 할 수 있음
- 리소스번들파일명 -
{enum이정의된클래스명}_{enum타입명}[{_언어코드}].properties
- 리소스번들파일내용 -
CouterGroupName={출력_카운터그룹명}
{enum필드1}.name={출력_카운터명1}
{enum필드2}.name={출력_카운터명2} ...
- 동적 카운터는 reporter.incrCounter(..) 호출 시 카운터그룹명과 카운터명을 인자로서 임의로 지정함
- 자바 코드에서 API로 카운터 조회
- 316P 예제코드 참조
- 사용자 정의 스트리밍 카운터
- 표준에러 스트림으로 정해진 포맷의 문자열을 전송
- 정렬
- 부분 정렬
- 전체 정렬
- 단일 파티션을 사용
- 순차적이면서 처리 시간이 균등하도록 분할된 파티션들을 만들어 최종적으로 각 출력을 전체적으로 정렬된 순서로 만드는 방식을 이용
- 균등한 파티션 집합 생성을 위해 키 샘플링을 통해 키 분포를 예측할 수 있음
- InputSampler.writePartitionFile(conf, InputSampler.RandomSampler<K,V>(균등확률, 샘플최대개수, 샘플링할 스플릿의 최대개수))
- 기타 샘플러 - SplitSampler, IntervalSampler
- 326P 소스코드 참조
- 보조 정렬
- 키를 원래의 키와 값의 조합인 복합키로 만듬
- 키 comparator는 복합키에 대하여 순서를 매김
- 복합키에 대한 파티셔너와 그룹핑comparator는 원래의 키에 대해서만 파티셔닝과 그룹핑을 수행함
- 330P 소스코드 참조
- 하둡 명령 옵션
- -D mapred.output.key.comparator.class= org.apache.hadoop.mapred.lib.KeyFieldBasedComparator
- -D mapred.text.key.comparator.options=”-k1n -k2nr”
- -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
- 조인
- 맵-사이드 조인
- 데이터가 맵 함수에 도달하기 전에 조인을 수행하는 방식
- 조건
- 각 입력 데이터셋은 동일한 개수의 파티션으로 나누어져야 함
- 각 데이터셋은 동일한 키(조인 키)에 의해 정렬되어 있어야 함
- 특정 키의 모든 레코드는 같은 파티션에 있어야 함
- 리듀서 개수가 같고, 같은 키를 가지고, 결과 파일이 분할되지 않는 (HDFS블록보다 작거나, gzip으로 압축된 경우) 조건을 만족하는 잡 결과물 조인에도 적용 가능
- CompositeInputFormat 사용
- 입력 데이터와 조인 유형을 문법에 맞는 조인 표현식을 설정
- join 예제 - org.apache.hadoop.examples.Join 참조
- 리듀스-사이드 조인
- 맵-사이드 조인처럼 입력 데이터셋이 특정한 방식으로 구조화될 필요는 없음
- 매퍼가 각 레코드에 태그를 붙이고 맵의 출력키로서 조인키를 사용하게 되면 동일 키의 레코드들은 하나의 리듀서에 모이게 됨
- 다중 입력을 적용해야 함
- MultipleInput을 사용하여 분석, 태그를 붙이는 로직을 분리함
- 보조 정렬을 수행해야 함
- 다른 출처로부터의 레코드들의 순서는 보장되지 않음
- 사이드 데이터 분배
- 사이드 데이터는 주 데이터셋을 처리하기 위해 잡 과정에서 필요한 부가적인 읽기전용 데이터임
- 캐시를 이용하여 같은 잡의 동일한 태스크 트래커에서 연속적으로 실행되는 태스크끼리의 데이터공유가 가능함
- 잡 환경 설정 파일을 이용하는 방법
- JobConf의 setter메소드를 이용하여 잡 환경 설정에 저장하고, 매퍼나 리듀서에서 configure()메소드를 오버라이드해서 전달된 JobConf의 getter메소드를 사용함
- 임의의 객체를 메타데이터로 전달하기 위해서 직렬화를 사용해야 함
- DefaultStringfier
- 하둡이 제공하는 클래스로 객체를 직렬화해줌
- 수 KB이상의 데이터를 전송하면 하둡 데몬에 메모리 부하를 발생시킴
- 분산 캐시
- 파일을 복사해서 태스크가 실행되어 파일을 사용할 시점에 파일을 분배시켜 주는 서비스
- 네트워크 대역폭을 줄이기 위해 일반적으로 파일이 특정 노드에 잡 단위로 복사됨
- GenericOptionsParser를 사용하는 응용프로그램에 옵션을 지정하는 방식
- -files 옵션
- 분산 시킬 파일을 따옴표로 구분지은 URI형태로 지정함
- -archive 옵션
- jar, zip, tar, gzipped tar 파일을 태스크에 복사
- 태스크 노드에서 파일이 해제됨
- -libjars 옵션
- jar 파일을 매퍼와 리듀서 태스크의 클래스패스에 추가
- 동작 방식
- 잡 실행 후 HDFS로부터 잡트래커의 파일시스템으로 복사됨
- 태스크 실행 전 잡트래커의 파일시스템으로부터 태스크트래커의 로컬 디스크 또는 캐시로 복사됨
- 태스크트래커는 캐시 파일을 참조하는 레퍼런스 수가 0일 경우 해당 파일을 삭제할 수 있음
- 로컬에서 일정 캐시 크기를 넘어서면 파일이 삭제됨
(local.cache.size 속성에 설정 - 기본 10GB)
- 태스크트래커에서의 파일 위치 - ${mapred.local.dir}/taskTracker/archive
- DistributedCache API
- addCacheFile(), addCacheArchive - HDFS상의 파일 위치 알림
- getLocalCacheFiles(), getLocalCacheArchives() - 태스크 노드가 로컬에 있는 캐시파일 목록 조회
- 맵리듀스 라이브러리 클래스
- ChainMapper, ChainReducer
- 단일 매퍼에서 매러의 체인을 실행하고, 매퍼의 체인이 끝난 후 단일 리듀서가 실행됨
- 상징적인 표현 - M+RM*
- 다수의 맵리듀스 잡을 실행하는 것보다 대체로 디스크 I/O를 줄일 수 있음
- FieldSelectionMapReduce
- 입력키와 값으로부터 필드를 선택하여 출력으로 내보낼 수 있음
- IntSumReducer, LongSumReducer
- 정수 값을 합하여 모든 키에 대한 총계를 계산함
- InverseMapper
- 키와 값을 바꿈
- TokenCounterMapper
- 자바의 StringTokenizer를 이용하여 입력 값을 단어 단위로 쪼개어 각 단어와 카운트를 내보냄
- RegexMapper
- 입력값에서 정규표현식에 해당하는 부분과 카운트를 내보냄