페이지

2017년 12월 17일 일요일

1. Mapreduce

최근 컴퓨팅 환경은 저가형 서버들을 클러스터링하고, 그것으로부터 다양한 리소스(cpu, 메모리, 하드디스크, 파일, 프로세스)들을 끌어 모아 표준화한 대규모 고성능 컴퓨팅 플랫폼을 구축하는 ㅣㅇㄹ에 많은 노력을 기울이고 있다(HPC, Grid, Cluster Computing). 이러한 컴퓨팅 환경은 대용량 데이터를 다루고 있는 다양한 응용 분야에서도 중요한 역할을 수행하게 되는데, 계산중심의 수학.과학 분야뿐만 아니라 데이터 중심의 텍스트 마이닝과 로그 모델링 같은 정보 분석 분야에서도 그 활용도가 높다. 실제 구글의 MapReduce 프로그래밍 방식은 대용량 데이터를 다루는 인터넷 분야에 상당한 영향을 끼치고 있다. 야휴는 오픈소스 하둡을 검색 전반에 걸쳐 활용하고 있으며, 아마존은 EC2와 S3를 선보임으로써 차세대 분산 컴퓨팅 기술을 선도하고 있다. 또한 Parallel DBMS 분양에서도 분산된 지역 DB로부터 다차원 데이터를 분석 처리하기 위하여 MapReduce 방식을 적극 도입하고 있다.

1. MapReduce
분할정복 방식으로 대용량 데이터를 대용량 데이터를 병렬로 처리할 수 있는 프로그래밍 모델이다. 구글에서 MapReduce방식의 분산 컴퓨팅 플랫폼을 구현해 성공적 적용함으로써 더욱 유명해졌으며, 오픈소스인 Hadoop MapReduce 프레임워크가 동일한 기능을 지원한다.
MapReduce 작업은 특별한 옵션을 주지 않으면 Map Task 하나가 1개의 블록(64MB)을 대상으로 연산을 수행한다. 예를 들어 320MB의 파일을 대상으로 작업을 돌리면 그림처럼 5개의 Map Task 가 생성되며, Map 과정에서 생산된 중간 결과물을 Reduce Task들(사용자가 개수 지정)이 받아와서 정렬 및 필터링 작업을 거쳐서 최종 결과물을 만들어 낸다.
________________________________________________________________________

가. 구글 MapReduce
구글은 대용량 데이터를 처리하는 수백 가지의 연산 방식들을 개발해 사용하였다. 대부분의 연산 방식들은 직관적이었지만 처리해야 할 데이터가 매우 컸기 때문에 수백 대 혹은 수천 대의 서버들에 분산 처리해야만 원하는 시간 안에 작업을 마칠 수 있었다. 이러한 분산 환경에서는 개발자가 연산의 병렬화, 데이터 분산, 장애 복구 등의 작업들을 직접 처리해야 하기 때문에 그만큼 ㅗㅋ드의 복잡성이 증가하여 많은 개발 시간이 소요된다. 개발자들에게는 이러한 병렬화, 장애 복구 등의 복잡성을 추상화시켜서 오직 핵심 기능 구현에만 집중할 수 있도록 해주기 위해서 MapReduce를 만들게 되었다.

-프로그래밍 모델
MapReduce는 Map과 Reduce 2개의 단계로 나눌 수 있으며 Map에서는 Key와 Value의 쌍들을 입력으로 받는다. 하나의 Key, Value 싸은 사용자가 정의한 Map 함수를 거치면서 다수의 새로운 Key, Value 쌍들로 변환되어 로컬 파일 시스템에 임시 저장된다. 저장된 임시 파일들은 프레임워크에 의해 Reduce에게 전송된다. 저장된 임시 파일들은 프레임워크에 의해 Reduce에게 전송된다. 이 과정에서 자동으로 Shffling 과 group by 정렬을 한 후 Reduce의 입력 레코드로 들어가게 되는데 형식은 Key와 Value의 리스트다. Reduce의 입력 레코드들은 사용자가 정의한 Reduce 함수를 통해 최종 Output으로 산출된다. 사용자 관점에서는 이전에 언급했던 장애 복구와 같은 세세한 이슈들은 신경 쓸 필요 없이 Map과 Reduce 두 함수만 작성하는 것만으로 대규모 병렬 연산 작업을 수행할 수 있다.

-실행 과정
사용자가 MapReduce 프로그램을 작성해 실행하면 마스터는 사용자의 프로그램에서 지정한 입력 데이터소스를 가지고 스케줄링을 한다. 가령 하나의 큰 파일은 여러 개의 파일 split들로 나뉘며, 각 split들이 Map 프로세스들의 할당 단위가 된다. 보통 split 단위는 블록 사이즈인 64MB 또는 128MB가 되며 split 수만큼 Map Task들이 워커로부터 fork됨과 동시에 실행돼 Output을 로컬 파일 시스템에 저장한다. 이때 Output 값들은 Partitioner라는 Reduce 번호를 할당해 주는 클래스를 통해 어떤 Reduce에게 보내질지 정해진다. 특별히 지정하지 않으면 Key의 해시(Hash)값을 Reduce의 개수로 Modular 계산한 값이 부여되어 동일한 Key들은 같은 Reduce로 배정된다. Map 단계가 끝나면 원격의 Reduce 워커들이 자기에 할당된 Map의 중간 값들을 테느워크로 가져, 사용자의 Reduce로직을 실행해 최종 산출물을 얻어 낸다. 보통 Reduce의 개수는 Map의 개수보다 적으며, 실행 흐름에서 알 수 있듯이 Map 단계를 거치면서 데이터 사이즈가 크게 줄어들고, 줄어든 크기만큼 Reduce 오버헤드도 줄어듦에 따라 성능상 이점이 많다. 하지만 정렬 같은 작업은 입력 데이터의 사이즈가 줄지 않고 그대로 Reduce로 전해지므로 오버헤드에 따른 수행 성능이 저하된다.
즉 정렬 같은 종유의 작업에는 MapReduce 모델이 적합하지 않다.

-포르톨러런스
각 프로세스에서는 Master에게 Task 진행 상태를 주기적으로 보낸다.마스터는 모든 워커들의 Task 상태 정보를 가지고 있다가 특정 워커의 태스크가 더 이상 진행되지 않거나 상태 정보를 일정한 시간 동안(Heartbeat Timeout) 받지 못하면 Task에 문제가 있다고 결론을 내린다. 특정 Map이나 Reduce Task들이 죽은 경우, 해당 Task가 처리해야 할 데이터 정보만 다른 워커에게 전해 주면 워커는 받은 데이터 정보를 인자로 새로운 Task를 재실행하면 된다.

나. Hadoop MapReduce
하둡은 아파치 검색엔진 프로젝트인 로씬(Lucene)의 서브 프로젝트로 시작되었다. 야후에서는 전담 팀을 구성해서 하둡을 지원하기 시작

-아키텍처
네임노드(NameNode) : 분산 시스템의 데몬
데이터노드(DataNode): 분산 시스템의 데몬
JobTracker : 마스터
TaskTracker : 워커데몬 (3초의 한번씩 마스터(JobTracker)에게 하트비트 전달)

클라이언트 -> 프로그램 바이너리와 입출력 디렉토리와 같은 환경 정보 -> JobTracker -> 여러 Task로 쪼갠 후 -> TaskTracker -> 데이터 지역서을 보장할지도 감안해 내부적으로 스케쥴링해 큐(Queue)에 저장 -> HeartBeat를 전송 -> JobTracker는 먼저 해당  TaskTracker에게 할당된 Task 가 있는지 큐에서 살펴본다.  이때 Task가 있으면 하트비트의 Response 메시지에 Task 정보를 실어서 TaskTracker에게 전달 -> TaskTracker는 Response 메시지의 내요을 분석해 프로세스를 fork해 자기에게 할당된 Task를 처리

-하둡의 성능
MapReduce에서 Sort는 어떠한 작업을 실행하도라도 Map 에서 Reduce로 넘어가는 과정에서 항상 발생하는 내부적인 프로세스다. 또한 Sort 자겁은 데이터가 커질수록 처리 시간이 선형적으로 증가한다. 클러스터 구성 서버들의 숫자를 늘림으로써 처리 시간을 줄일 수 있는 것은 아니다. 플랫폼 자체적으로 선형 확장성을 갖고 있어야 처리 시간을 줄일 수 있다. 이런 의미에는 Sort는 하둡 같은 분산 컴뷰팅 플랫폼의 성능과 확장성을 동시에 측정할 수 있는 좋은 실험이라고 할 수 있다. Hadoop MapReduce는 개발 초기인 2006년 이후 최근까지 6배 정동의 성능 향상이 있었다.

댓글 없음: