IT/[ Bigdata ]

[ Bigdata ] 02. Hadoop 커스터마이징하기

kim.svadoz 2020. 8. 10. 13:32
728x90
반응형

20-03-09 월

mapreduce의 기본동작은 분류와 집계하기. - 빈도수체크

< 하둡 커스터마이징 >

  • csv파일 hdfs에 옮겨놓기.

image-20200309103624440

  • 컴바이너는 mini reducer
  • 합을 구하는 작업에서는 컴바이너쓴거랑 안쓴거랑 차이가 많이 난다. 아래는 컴바이너 쓴 것들. 기존에 비해서 데이터가 엄청 줄었음.

image-20200309114757083
image-20200309132004376

- 컴바이너 클래스

셔플(shuffle)할 데이터의 크기를 줄이는 데 도움을 준다. => 성능 UP !

- 파티셔너 클래스

  • mapreduce 동작 순서 : mapper - combiner - partitioner(맵에서 가져온 거를 같은 키를 기준으로 정렬) - reducer
    • combiner와 partitioner가 셔플 단계임
    • Partitioner를 사용자 정의로 커스터마이징 하겠다.
    • 정렬이 될 수 있게 클래스를 변경하는 작업 수행
    • Key를 커스텀하여 CustomKey를 생성
    • 리듀서로 넘겨줄 때 같은 키를 기준으로 처리한다. 그 기준은 사용자정의 커스터마이징 하는것.(문자열을 기준으로 비교)

- 정렬을 위한 rownum 활용

  • 가상의 테이블 만들기 - subquery를 from절에서 활용하기( 페이징 처리도 가능)
select rownum, ename, sal
from (select *
       from emp
      order by sal desc) sorttable
where rownum <=3;

1. 정렬

1) 보조정렬
  1. 정렬하려고 하는 기준을 정의한 사용자 키 클래스를 작성

    => 복합키

  2. Mapper 클래스의 map메소드에서 사용자 키가 outputkey로 출려고딜 수 있도록 정의

  3. Reduce태스크에 분배할 수 있는 partitioner를 정의

    => 같은 키를 갖고 있는 Mapper의 출력데이터를 같은 리듀스태스크로 보내기 위해서 해시코드를 이용해서 계산

  4. Reduce태스크로 보내기 전에 같은 그룹으로 그룹핑을 할 수 있도록 객체를 정의.

    => 그룹키비교기

    => ex) air데이터에서 같은 년도별로 데이터를 분류

  5. 4번에서 같은 그룹으로 정의한 데이터 내부에서 두 번째 기준을 적용해서 비교할 수 있도록 객체를 정의

    => 1번에서 정의한 복합키의 기준으로 데이터를 정렬하기 위한 객체

    => 복합키비교기

2. 조인


20-03-11 수

  • Hadoop FireFox

    • hadoop01:50030 : 네임노드 페이지 (파일탐색기)
    • hadoop01:50070 : 잡트래커 페이지 (map, reduce 확인)
  • inputdata.txt 넣고 출력해보기

image-20200311094554513
image-20200311094736521

  • package mapreduce.basic;
    
    public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
        IntWritable resultVal = new IntWritable();
        Text appenddata = new Text();
        String data = "";
        Text resultKey = new Text();
    
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values,
                Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            int sum = 0;
            data = data + "reduce호출";
            appenddata.set(data);
            for (IntWritable value:values) {
                sum += value.get();
            }
            resultVal.set(sum);
            resultKey.set(key+":"+appenddata);
    
            context.write(resultKey, resultVal);
        }
    
    }

    image-20200311101558368
    image-20200311101612546

=> 전달되는 key 갯수만큼 reduce 메소드가 실행됨

  • 커스터마이징이랑 그냥 동작하는 거랑 다르다.
728x90
반응형