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에서 지정