2012년 2월 26일 일요일

맵리듀스 기능

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

댓글 없음:

댓글 쓰기