FUNDAMENTAL 24. 맵리듀스로 그리는 빅데이터 지도
1. "빅"데이터 처리의 기본패턴
- 빅데이터를 처리한다. 말 그대로 데이터 용량이 크고 처리 시간도 많이 소요될 것이 머리속에 그려진다.
- 그럼 좋은 성능의 컴퓨터를 써야하겠고, 혹은 여러 컴퓨터를 연결하여 작업을 분할해 볼 수 있다.
- 이런 컴퓨터 자원을 엮어서 병렬 컴퓨터(Parallel Computing), 분산 컴퓨터(Distributed Computing)을 통해 단일 컴퓨터로는 처리하기 힘든, 혹은 아예 메모리에 담아둘 수조차 없을 많큼 큰 데이터를 다뤄볼 수 있다.
- 비슷한 개념으로 클러스터 컴퓨팅(Cluster Computing)이라는 것도 있다.
- 빅데이터를 다루는 솔루션이라는 하둡, 스파크 등의 생소한 이름의 빅데이터 처리 매커니즘이란 것이 있다.
- 오늘 배울 개념은 맵리듀스(Mapreduce)라는 것으로 하둡, 스파크 등 빅데이터를 다루는 솔루션들의 가장 근간이 되는 프로그래밍 모델이다.
- 내가 처리해야할 데이터의 양이 많다면 어떻게 하겠는가 -> 1) 많은 것을 잘게 나눈다. 2) 각각을 처리한다. 3) 처리된 것들을 모아서 통합하여 결과물을 낸다.
- 위에 말한 3개의 생각이 맵리듀스의 개념의 전부이다. 아주 상식적이고 일상에서도 많이 쓰고 있는 개념이기에 적응하는데 어려움은 없을 듯 하다.
- 이 노드에서는 일상적인 비유로 맵리듀스의 개념을 설명하고 있다. 바로 부잣집 일꾼 이야기이다.
1) 어느 부잣집 일꾼이다. 주인이 쌀 한 가마니에서 모래가 들어있는지, 있으면 분리하라는 지시를 내린다.
2) 혼자는 불가능하니 친구 일꾼 100명을 불러서 아까 생각한 아이디어처럼 움직인다.
(1) 한가미니의 쌀을 100등분으로 잘게 나눈다.
(2) 한 명당 그 1/100을 가져가 각각 처리(한알씩 골라내기)를 한다.
(3) 각자가 분리해 낸 깨끗한 쌀을 한곳에 모아 다시 한가마니를 만든다.
3) 이것은 맵리듀스의 개념과 일치하는 행동이다.
- 일꾼 혼자서 처리할 수 없는 일거리를 여럿이 나눠 처리하는 것과 컴퓨터 한 대로는 처리할 수 없는 분량의 데이터를 여러 대가 나눠서 처리하는 작업의 원리는 같다.
- 이것을 데이터분석의 Split-Apply-Combine Strategy라고 한다.
2. Split-Apply-Combine
- 이름에서 예상되듯 여기에는 Split 단계, Apply 단계, Combine 단계가 있다.
1) Split 단계(GroupBy object 생성)
(1) 일부 기준에 따라 데이터를 그룹으로 분할하여 GroupBy object를 만든다. (열 또는 열 조합을 사용하여 데이터를 그룹으로 분할 할 수 있다.)
(2) 한 가마니의 쌀을 100등분으로 나누었다. 나눌 때 적용한 기준은 없고, 그냥 동일한 크기로 나누었다. 1/100 가마니로 나뉜 모래 섞인 쌀들이 GroupBy object가 된다.
2) Apply 단계
(1) 각 그룹에 독립적으로 Function를 적용한다. (이 단계에서 데이터를 집계(Aggregate), 변환(Transform) 또는 필터링(Filter) 한다.)
(2) 명당 1/100을 가져가 2개 카테고리(모래, 쌀)로 분리하므로, Function은 Filter로 볼 수 있다.
3) Combine 단계
(1) 이렇게 처리된 것들을 모아서 통합 결과물을 낸다.
(2) 각자 분리해 낸 깨끗한 쌀을 한가마니로 통합시킨다.
- Mapreduce에는 크게 map함수와 reduce 함수로 구성되어 있다. 두 개를 합치면 Mapreduce가 된다.
1) map함수는 Split된 부분 데이터를 가져다가 어떤 특별한 조작을 가하는 Apply 역할을 하는 함수이다.
2) reduce함수는 map함수가 만들어낸 결과물을 어떤 기분에 따라 한군데로 다시 모아내는 Combine역할을 하는 함수이다.
3. 맵리듀스의 원리
- 맵리듀스는 하나의 컴퓨터에서 하던 작업을 여러 개의 컴퓨터에서 처리하도록 분산시키는 프로그래밍 모델이다.
- 이 모델은 처리하고자 하는 작업을 여러 컴퓨터에 자동으로 분할하고 지역 처리 및 클러스터 노드 간 통신을 하기 위해 사용한다.
- 2004년 구글의 제프리 딘과 산제이 기마와트는 맵리듀스의 논문을 발표한다. 맵리듀스를 최초로 제안한 공식 자료이다.
- 위 그림은 논문의 저자들이 작성한 요약 설명 슬라이드 자료의 일부분이다.
1) Mapreduce는 map과 reduce 2개의 함수만 강조되고 있는 것 같지만, 실은 Split 단계를 전제로 하고 있다.
2) 그림에서 map 함수를 보면 in_key와 in_value를 인자로 갖는다.
(1) in_key란 바로 Split의 결과로 생긴 partitioning 키값이다.
(2) 일꾼 예제면 0~99번 친구의 키값이라 할 수 있다.
(3) 이 키값은 최종 Output에는 반영되지 않는다. 누가 구분했는지는 중요하지 않기 때문이다.
3) map함수는 Split된 데이터를 가져다가 out_key와 intermediate_value의 리스트로 변환한다.
(1) out_key는 map함수가 결과물을 구분하는 기준 키값이다.
(2) 일꾼 예제면 0 : 쌀, 1 : 모래 같은 형태를 말한다. 일꾼 예제의 map 친구들은 길이가 2인 list에 각각 쌀과 모래를 담아서 리턴할 것이다.
4) reduce함수의 입력은 여러 map함수의 intermediate_value들을 out_key별로 구분해서 리스트업한 것을 입력으로 받는다.
(1) 일꾼 예저면 100명의 친구들이 모아 준 쌀 100개와 모래 100개가 입력이 될 것이다.
(2) 이것을 가지고 reduce함수는 out_key기준으로 sum을 할 것이다.
(3) 그래서 reduce함수인 일꾼은 최종적으로 out_value의 list를 출력할 것이다.
(4) 즉, 전체 쌀과 전체 모래를 모아놓은 길이 2의 list가 최종 출력이 될 것이다.
- 여기서 초기 Mapreduce의 한가지 약점이라고 할 수 있는 특징이 나타난다.
1) reduce 함수는 모든 map 함수가 중간 결과물을 리턴할 때까지 기다렸다가 한꺼번에 그룹핑한 결과가 나올 때까지 기다려야한다.
2) 일꾼 예제면 마지막 친구가 작업이 늦여져서 끝날 때까지 기다렸다가 모래와 쌀을 전부 취합한다는 것이다.
4. 분산환경의 빅데이터 처리
- 병렬 컴퓨팅(Parallel Computing) : 한 대의 컴퓨터 안에서 CPU 코어를 여러 개 사용해서 한 대의 컴퓨터가 처리하는 데이터의 총량과 처리속도를 증가시키는 것.
1) 멀티 프로세스(Multiprocessing) : 프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 의미한다. 멀티란 2개 이상의 프로세스를 사용하는 것이다.
2) 멀티 스레드(Multithreading) : 스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위이다. 일반적으로 한 프로그램은 하나의 스레드를 가진다. 멀티란 2개 이상의 스레드를 사용하는 것이다.
- 분산 컴퓨팅 : 여러 대의 컴퓨터가 네트워크로 연결된 상황을 전제로 한다. 따라서 아래와 같은 네트워크 용어가 중요하게 다뤄진다.
1) P2P(Peer to Peer)
2) HTTP
3) Network
- 클러스터 컴퓨팅 : 이 용어는 분산 컴퓨팅과 매우 혼용되고 있다.
1) 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합이다.
2) 보통 노드와 관리자로 구성되어 있다.
(1) 클러스터 노드 : 프로세싱 자원을 제공하는 시스템이다.
(2) 클러스터 관리자 : 노드를 서로 연결하여 단일 시스템처럼 보이게 만드는 로직을 제공한다.
3) 대표적인 기술 : 병렬 컴퓨팅(Parellel Computing), 분산 컴퓨팅(Distributed Computing), 클라우드 컴퓨팅(Cloud Computing)
4) 클러스터는 여러 대의 컴퓨터들이 연결되어 있는 것이다. 이 때 컴퓨터를 어떻게 연결하고 컴퓨팅 자원을 관리할 것인지에 따라 많은 기술이 알려져 있다.
5) 다음에 배울 하둡, 스파크 같은 시스템들은 이런 클러스터 컴퓨팅을 전제로 설계된 시스템이다.
5. 하둡과 스파크
- 하둡
1) 대용량 데이터를 분산 처리할 수 있는 자바 기반의 오픈소스 프레임워크이다.
2) 2004년 구글에서 Mapreduce가 발표되고, GFS(Google File System)이라는 구글의 분산 파일 시스템이 나오면서 천문학적인 크기가 된 인터넷 검색 데이터를 분산처리하는 기술을 통해 구글이 기술적 우위를 공고히 하게 된다.
3) 특히 GFS는 구글에서 공개를 하지 않았다. 이에 아파치 재단에서는 구글의 맵리듀스와 GFS에 해당하는 HDFS(Hadoop File system)를 포함하는 하둡(Hadoop)이라는 오픈소스 프로젝트를 2006년에 발표했다.
4) 하둡은 오픈소스라는 강점을 내세워 대략의 데이터 처리를 지원하는 사실상의 표준 프레임워크로 군림하게 되었다.
5) 그러나 하둡은 Mapreduce의 문제이기도 한 약점인 map함수가 모두 종료해야 reduce함수가 실행된다는 문제를 가지고 있다.
6) 사실상 하둡은 이 문제로 실시간 서비스를 제공하는 것을 불가능하게 했고, 하둡은 빅데이터 기반의 배치성 통계작업에만 주로 투입되고 있다.
- 스파크
1) 2009년에 처음 발표된 스파크는 종래릐 Mapreduce 기능에서 map함수가 전부 종료되지 않았더라도 map의 결과를 스트리밍 하는 방식으로, map의 결과가 다 나와야만 reduce를 수행한다는 전제를 깨버렸다.
2) 맵리듀스는 map함수의 결과가 디스크에 저장되고, 그것을 reduce함수가 다시 읽어와야 한다는 성능상 손실을 크게 주는 설계였다.
3) 반면 스파크는 인메모리 데이터 엔진을 통해 초기 맵리듀스의 성능상 한계를 크게 극복하게 된다. 실제로 스파크의 성능은 Hadoop의 10배에 달하는 속도라고 한다.
4) 그 외에도 다양한 스파크 강점이 있지만, 요번에는 세밀하게 다루진 않았다.
- 주의할 것은 스파크가 하둡에 절대 우위를 보인다고 생각하면 안된다.
6. 함수, 파이썬의 1급 시민
- 파이썬을 이용한 맵리듀스 프로그래밍에서 언급해야 할 중요한 점이 있는데, 바로 함수가 파이썬에서 1급 시민이라는 점이다.
- 이 특징은 함수형 프로그래밍 개념으로 파이썬에서 맵리듀스를 활용하는 것을 매우 강력하게 한다.
- 여기서 1급 시민ㅇ이란 말은 함수가 아래와 같은 기능을 할 수 있다는 것을 의미한다.
1) 함수는 다른 함수의 인자로 전달될 수 있다. (= 인자(매개변수)로 전달이 가능하다)
2) 함수는 변수에 할당될 수 있다.
3) 함수는 다른 함수의 결과로서 반환될 수 있다. (= 다른 함수의 반환값)
- 파이썬에서 "모든 것은 객체다"라는 말을 들어 본 적 있을 것이다. 그중 최고는 함수이다.
- 함수형 프로그래밍은 모든 것을 객체로 표현하게끔 하는 것이다. 모순적인것 같지만 함수 또한 객체이기 때문에 함수를 값으로 할당하고 결과값으로 반환할 수 있다.
- 함수형 프로그래밍의 철학
1) 변경 가능한 상태를 불변의 상태(Immutab)으로 만들어 에러를 없애자.
2) 모든 것은 객체이다.
3) 코드를 간결하게 하고 가독성을 높여 구현할 로직에 집중한다.
4) 보다 효율적인 동시성 작업
7. 함수형 프로그래밍과 맵리듀스
- 데이터 컬렉션
1) 파이썬 자료 구조 중에 List, Tuple, Dictionary, Set와 같은 형태의 자료형을 컬렉션(Collection)이라고 하기도 한다. 다른 말로는 컨테이너(Container)라고 부른다.
2) 파이썬은 collections 모듈을 통해서 위 자료형 외 데이터 컬렉션 타입을 제공하기도 한다.
3) 밑의 사진은 파이썬 공식문서에 나온 내용이다. 여기서 deque, namedtuple(), defaultdict은 자주 사용된다.
4) 컬렉션을 말한 이유는 빅데이터라는 대용량의 자료를 표현할 때 이러한 타입으로 저장하는 경우가 매우 많기 때문이다.
- 맵리듀스 기본 함수 알아보기
1) 파이썬에서 함수를 데이터 컬렉션에 적용하는 패턴에는 3가지가 있다.
(1) map(매핑) : 컬렉션의 모든 요소에 함수를 적용(=매핑)한다.
(2) filter(필터링) : 컬렉션 애의 요소를 선택(=필터링)한다.
(3) reduce(리듀싱) : 컬렉션을 축약한다. 가장 일반적인 예로는 요소들을 합하는 시그마 연산이 있다.
2) 파이썬의 map함수와 reduce함수가 맵리듀스와 비슷한 듯 느껴진다. map함수와 reduce 함수는 중요한 개념이다.
8. 맵리듀스 예제
- 이번에는 실전 예제를 통해 맵리듀스를 구현했다.
- 주요 개념으로 맵리듀스는 4가지 단계가 있다.
1) Split - Map - Shuffle - Reduce. input과 output은 각각의 키-값 쌍으로 존재한다.
2) 각각의 단계는 크게 Map Task(split, map)와 Reduce Task(shuffle, reduce)로 구분할 수 있다.
- 예제로는 알파벳 수 찾기를 가지고 실습했다.