DBILITY

hadoop MapReduce 프로그래밍 요소 본문

bigdata/hadoop

hadoop MapReduce 프로그래밍 요소

DBILITY 2016. 11. 24. 15:07
반응형
  1. DataType
    네트워크 통신을 위해 최적화된 Writable과 Comparable을 다중 상속한 WritableComparable Interface를 제공.
    compareTo 메서드는 Key끼리 비교해(Compares two strings lexicographically) 정렬한다.
    (복합 키 정의 시 Mapper와 Reducer에서는 toString메서드를 호출하여 값을 출력하므로 반드시 구현하여야 함)
    write 메서드는 데이터를 직렬화(byte stream) 하고, readFields는 직렬화된 데이터(byte stream)를 해제하고 읽는다.

  2.  
  3. 데이터 포맷 클래스는 두 메서드를 구현하는 부분에서 데이터를 읽고 쓰는 기능을 처리한다.
    자주 사용하는 데이터타입에 대한 Wrapper클래스를 제공한다.
     Class Target DataType Size Sort Order
     BooleanWritable  Boolean  1 false,true
     ByteWritable  single byte 1 Ascending
     BytesWritable  byte array

     DoubleWritable  Double 8 Ascending
     FloatWritable  Float  4 Ascending
     IntWritable  Integer 4 Ascending
     MD5Hash  byte array (md5) 
     
     LongWritable  Long 8 Ascending
     TextWrapper(Text)  UTF8 Format Text 2G Alphabetic 
     NullWritable  데이터 값이 필요 없을 경우
     
  4. InputFormat
    Input Split을 Map메서드의 입력 파라미터로 사용할 수 있도록 InputFormat abstract class를 제공
    InputSplit -> RecordReader -> Mapper
     InputFormat  Funtional Description
     TextInputFormat  텍스트 파일 분석용, 개행 문자(\n)로 레코드 분류
     Key는 LongWritable Type 라인 번호, Value는 Text Type의 라인 내용
     KeyValueTextInputFormat  텍스트 파일을 사용할 때, 라인 번호 대신 임의의 키값을 지정할 수 있음
     ex. getConf().set("mapreduce.input.keyvaluelinerecordreader.key.value.separator",",");
     NLineInputFormat  InputSplit당 입력받는 텍스트 파일의 라인수를 지정할 수 있음
     ex. getConf().setInt("mapreduce.input.lineinputformat.linespermap",150);

     테스트 결과 InputSplit의 최대수는 10,000,000개임
     DelegatingInputFormat  여러 개의 서로 다른 입력 포맷을 사용하는 경우 각 경로에 대한 작업을 위임
     MultipleInputs 참고
     CombineFileInputFormat  다른 InputFormat은 file별로 split을 생성하지만, 이것은 다수의 file을 split으로 묶어서 사용
     각 node와 rack의 위치를 고려해 split을 결정함
     SequenceFileInputFormat  binary형태의 key, value list로 구성된 텍스트 파일로
     SequenceFile은 압축, 직렬화를 이용해 다양한 유형으로 저장
     SequenceFileAsBinaryInputFormat  SequenceFile의 key, value를 임의의 binary Object로 변환하여 사용
     SequenceFileAsTextInputFormat  SequenceFile의 key,value를 Text Object로 변환하여 사용
  5. Mapper
    InputSplit마다 MapTask생성, InputSplit으로부터 key, value쌍으로 한 라인씩 입력을 받아 가공, 분류하도록 사용자 프로그래밍 기능
  6. Combiner (Mini-Reducer or Semi-Reducer)
    MapTask의 출력은 Network를 통해 ReduceTask로 전달되며, 이 과정을 Shuffle이라 함.
    전송 데이터를 크기를 줄인다면 IO가 줄어들어 성능이 개선됨.
    Combiner는 shuffle 할 데이터의 크기를 줄이는 역할을 하며, Mapper의 출력 데이터를 입력 데이터로 전달, MapTask와 같은 Node에서 실행됨
    Reducing을 Mapping Node에서 먼저 실행(Reducer를 상속받아 reduce메서드에서 Grouping and Summery)하여 데이터 출력.
    Driver Class에서 job.setCombinerClass를 통해 설정할 수 있다.
  7. Partitioner
    MapTask의 출력 데이터가 어떤 ReduceTask로 전달될지 결정(조건처럼 동작)
    기본으로 HashPartitioner를 제공하며, Partitioner를 상속받아 getPartition 메서드를 재정의할 수 있다.
    Driver Class에서 job.setPartitionerCalss를 통해 설정할 수 있다.
    Partitioner의 개수는 Reducer의 개수와 일치하여야 하므로, setNumReduceTasks(N)로 Reducer의 개수를 지정한다.
    이때, 지정한 N이 getPartition 메서드의 numReduceTasks인자가 됨. 즉, Reducer의 수로 MapTask의 출력 데이터를 나누게 된다.
  8. Reducer
    MapTask의 출력을 입력 데이터로 집계 연산 수행
    입력 데이터의 Key를 바탕으로 Sorting
  9. OutputFormat
    Job Interface의 setJobOutputFormatClass로 설정, OutputFormat abstract class를 상속받아 구현한다.
     OutputFormat  Funtional Description
     TextOutputFormat  텍스트 파일에 레코드 출력하며, key, value의 구분자는 tab을 사용
     SequenceFileOutputFormat  시퀀스 파일 형태로 출력
     SequenceFileAsBinaryOutputFormat  SequenceFileOutputFormat을 상속받아 구현,
     binary format의 key와 value를 SequenceFile Container에 씀
     FileOutputFormat  OutputFormat Class의 Wrapper Class
     LazyOutputFormat  FileOutputFormat을 상속받은 Class는 출력 내용이 없더라도 출력 파일이 생성되나,
     첫 번째 레코드가 해당 파티션(part-nnnnn)으로 보내질 때 출력을 생성
     NullOutputFormat  출력 데이터가 없을 때 사용

참고 서적 : 시작하세요!  하둡프로그래밍 개정 2판(위키북스) - 정재화 지음

반응형

'bigdata > hadoop' 카테고리의 다른 글

hadoop job list, kill  (0) 2016.11.30
성별,연령대별 최고연봉 구하기  (0) 2016.11.29
hadoop MRUnit 사용하기  (0) 2016.11.17
hadoop ChainMapper, Reducer exercise  (0) 2016.11.14
하둡 정리 2  (0) 2016.11.13
Comments