[데이터공학] MapReduce Programming Basic

Zoe·2022년 3월 25일
0

데이터공학

목록 보기
2/9

MapReduce Programming Basic


✅ WordCount

  • Problem : 주어진 text에서 각 단어가 몇 번 등장하는지
  • Example : Data->to be or not to be
  • Results : to(2회), be(2회), or(1회), not(1회)
  • 이상치가 생길 수 있음
  • 그 이벤트가 특정 기간 성별 지역 등에 따라서 몇 번이나 발생했는지 패턴을 찾음
  • 모든 통계처리에 기본적으로 들어갈 수 밖에 없음
  • 일단 집계를 해야 함
  • 굉장히 중요한 ...

✅ MapReduce

  • map 하고 reduce는 이미 존재하고 있었음

✅ WordCount 의사코드

  • input : Map(key, value)
  • Tokenize value
  • Map이 해주는 건 각 단어를 토크나이즈하고 체크해서 이 아웃풋(6개의 엔트리)을 하둡으로 넘겨줌
  • Reduce의 input : list(values)
  • output : Reduce라는 함수를 통과하면 리스트를 집계해줌

✅ MapReduce Code

  • Code를 Data로!
  • 이 함수를 각각 데이터가 있는 쪽으로 보내는 것임
  • Machine1, Machine2에 각각 Map이 날라감
  • 하둡에서 우리가 작성하는 map함수는 우리가 호출하는 게 아니라 하둡이 호출하는 것임
  • 하둡이 데이터를 읽은 다음 key value의 인풋형태로 만들고 우리가 만든 맵을 호출하는 것
  • 하둡은 텍스트를 처리할 때 한 줄 읽어서 맵의 인풋을 만들어줌
  • 그 파일에서 해당 줄이 파일 시작부터 얼마나 떨어져있는지 계산해서 넣어줌
  • 하둡이 한 줄을 읽은 다음 맵을 호출(한줄 읽고 맵 이걸 반복함)
  • 리듀스로 가기 전에 하둡이 같은 key를 가진 애들을 모아줌(array로 묶어줌)- shuffle slide확인
  • Input(HDFS) -> Map Phase -> Shuffle(하둡이 해줌) -> Reduce Phase -> output

✅ Real Java Code

public class WordCount {
	public static class Map extends Mapper {
    	public void map(...) {
    		...
    	}
	}
    public static class Reduce extends Reducer {
    	public void reduce(...) {
    		...
    	}
	}
    public static void main(String[] args) throws Exception {
    ...
    }
}
  • main에서 하는 일 : 맵/리듀스 클래스 지정, 입력 파일 위치, 출력 디렉토리 지정, 입출력 포맷지정, 최종(리듀스)의 출력 키 및 밸류 타입, 맵의 출력 키 및 밸류 타입, Job을 수행(결과가 나옴)

✅ Map

  • mapper라는 클래스를 상속받음
  • <LongWritable, Text, Text, LongWritable>
  • <map input key type, map input value type, map output key type, map output value type>
  • map의 output을 하둡에 던짐 :context.write(word, one);
  • map 함수에서는 오프셋 정도는 필요없다.
  • key는 버림. 한 줄로 들어오는 text가 의미가 있는 것
  • 이게 뭐임..
  • Haddop 기본 타입 : Text(String), IntWritable, Longwritable, FloatWritable, BooleanWritable, ArrayWritable, NullWritable(값이 없음)
  • toString하면 get이랑 똑같음

✅ Reduce

  • <Text, LongWritable, Text, LongWritable>

  • <reduce input key type, reduce input value type, reduce output key type, reduce output value type>

  • values에 들어있는 모든 엔트리는 1임

  • 1들을 다 합하면 몇 번 나왔는지 계산이 되는 것

  • sum에는 횟수가 누적합이 될 것. 이것을 밸류로 잡음

🚨 비즈니스 로직 자체는 map하고 reduce만 신경 쓰면 됨. 나머지는 하둡이 해줌(셔플, 예외 발생..). 분산 컴퓨팅에 대한 진입장벽이 낮아짐.

2021.04.01

  • 다음주 화요일 6시까지 돌봐주겠다.
  • 오늘은 돌려보기
  • 뭔소리지
  • 우분투14는 안됨
  • 운영체제 설치해서 와야함
  • 패키지는 설치해야 함
  • 준비를 최대한 많이 해오기

✅ Review

  • 기성품 서버를 붙여서 하는 방식으로 서버를 구성 : 가성비
  • 하드웨어 failure가 늘 일어나게 됨
  • 데이터 처리를 원활하게 하기 위해 여러 카피를 저장함
  • 저장하는 strategy도 정해져 있음
  • 또 다른 데이터 센터
  • Machine2 : 데이터가 저장되어 있는 서버쪽으로 코드를 전달 -> 네트워크 사용률을 줄이기 위해
  • 네트워크를 사용하는 것 자체가 전기를 쓰는 것임 -> 열 받음 -> 쿨링 필요 ( 또 전기 쓰는 것 ) -> 전기를 많이 쓰게 됨
  • financial을 한번 만났다
  • shuffle : 하둡이 하는 일. 리듀스에게 전달하기 전에 같은 키를 가지는 맵의 아웃풋을 모아줌. list의 형태로
  • 중복된 거 하지마. -> 줄일 수 있는 방법 : 합치면 됨. financial2로 보내자. potter2로 보내자.
  • 리듀스임 -> 머신 안에서 집계를 함
  • 집계를 해주는 것은 combiner라고 함

combiner

  • 맵 수준에서 나오는 데이터를 집계를 해준다
  • 네트워크 오버헤드가 감소
  • 숫자의 개수가 줄어들기 때문에 셔플의 오버헤드가 줄어듬
  • 맵은 combiner가 껴있어도 결과가 똑같음
  • 기계수준에서(맵 프로세스 수준에서) 집계를 해준다
  • shuffle은 combiner의 결과를 input으로 받는다
  • 아까 기준으로 보면 상당히 많이 레코드의 개수가 감소한 것을 볼 수 있음
  • reduce는 여전히 그렇다
  • WordCount에서는 Reduce에서 하는 작업이 Combiner에서 하는 일과 정확히 같다
  • Combiner class를 main에서 지정
profile
iOS 개발자😺

0개의 댓글