클라우드 컴퓨팅은 일반적으로 데이터 센터 레벨의 확장성과 신뢰성을 바탕으로 인터넷을 통해 온디맨드 자원 또는 서비스를 제공하기 위해 설계되었다. MapReduce는 작업을 독립 태스크 세트로 분할하여 대용량 데이터를 병렬로 처리하기 위해 설계된 프로그래밍 모델이다. Google의 BigTable, Hadoop 및 Sector와 같은 일부 capacity-on-demand 스타일의 클라우드에서 지원되는 병렬 프로그래밍 스타일이다.
이 기사에서는 Randomized Hydrodynamic Load Balancing 기술(자세한 정보는 다음 섹션 참조)을 따르는 로드 밸런싱 알고리즘을 사용한다. 가상화를 사용하여 실제 서버의 수와 비용을 줄일 뿐만 아니라 한발 더 나아가서 실제 시스템의 CPU 사용률을 효율적으로 향상시킨다.
이 기사를 이해하려면 클라우드 컴퓨팅 개념, Randomized Hydrodynamic Load Balancing 기술 및 Hadoop MapReduce 프로그래밍 모델에 대한 일반적인 수준의 이해가 필요하다. 병렬 프로그래밍에 대한 기본적인 이해와 Java™ 또는 기타 오브젝트 지향 언어에 대한 프로그래밍 지식도 많은 도움이 된다.
이 기사에서는 다음과 같은 제품을 사용하여 MapReduce 알고리즘에 시스템에 구현했다.
- Hadoop 0.20.1
- Eclipse IDE 3.0 이상(또는 Rational Application Developer 7.1)
- Ubuntu 8.2 이상
MapReduce 알고리즘을 살펴보기 전에 이 기사를 이해하는 데 필요한 클라우드 아키텍처, 로드 밸런싱, MapReduce 및 병렬 프로그래밍에 대한 기본적인 내용을 먼저 살펴보자.
그림 1에서는 전체 시스템, 플랫폼, 소프트웨어 및 이러한 요소가 이 기사의 목표를 달성하는 데 사용되는 방법을 자세히 보여 준다.
그림 1. 클라우드 아키텍처
Ubuntu 9.04 및 8.2는 운영 체제로 사용되며, Hadoop 0.20.1, Eclipse 3.3.1 및 Sun Java 6은 플랫폼으로 사용되고, Java 언어는 프로그래밍 언어로, HTML, JSP 및 XML은 스크립트 언어로 사용된다.
이 클라우드 아키텍처에는 마스터 및 슬레이브 노드가 있다. 이 구현에서 기본 서버는 클라이언트 요청을 받은 후 요청의 유형에 따라 요청을 처리한다. 마스터 노드는 기본 서버에 있고 슬레이브 노드는 보조 서버에 있다.
그림 2에서 볼 수 있듯이 검색 요청은 Hadoop의 NameNode로 전달된다. 그런 다음 Hadoop NameNode에서는 많은 수의 Map 및 Reduce 프로세스를 시작하여 검색 및 인덱싱 작업을 수행한다. 특정 검색 키에 대한 MapReduce 작업이 완료되면 NameNode가 서버와 클라이언트에게 차례로 출력 값을 리턴한다.
그림 2. 검색 및 인덱싱을 수행하는 Map 및 Reduce 함수
특정 소프트웨어에 대한 요청일 경우에는 고객 테넌트 ID, 지불 기한, 특정 소프트웨어를 사용할 수 있는 적격성 및 소프트웨어 임대 기간을 바탕으로 인증 단계가 수행된다. 그런 다음 서버에서 이 요청을 처리하여 사용자가 선택한 소프트웨어 조합을 사용할 수 있도록 허용한다.
여기에서 소프트웨어의 단일 인스턴스가 여러 테넌트를 지원할 수 있는 SaaS의 멀티테넌시 기능이 제공된다. 모든 테넌트 관련 요청에는 테넌트 ID를 기반으로 생성된 간단한 분리 행이 있다. 이러한 요청은 단일 인스턴스에서 사용된다.
테넌트 관련 클라이언트 요청에서 파일을 검색하거나 다른 멀티테넌트 소프트웨어를 사용하려는 경우 오퍼링은 프로비저닝된 운영 체제 인스턴스(PaaS)에 있는 Hadoop을 사용한다. 또한 클라우드에서 데이터(예를 들어, 데이터베이스나 파일)를 저장하려면 클라이언트가 데이터 센터의 메모리 공간을 사용해야 한다(IaaS). 이러한 모든 작업은 자동으로 처리되므로 일반 사용자가 관여하지 않아도 된다.
Randomized Hydrodynamic Load Balancing: 기본 사항
로드 밸런싱은 다른 자원이 사용 중일 때 유휴 상태에 있는 자원이 없도록 하기 위해 사용된다. 로드 밸런스를 적절히 유지하기 위해 워크로드가 높은 소스 노드의 로드를 비교적 워크로드가 낮은 대상 노드로 옮길 수 있다.
런타임 동안 로드 밸런싱을 적용하는 경우를 동적 로드 밸런싱이라고 하며 실행 노드 선택에 따라 직접적 또는 반복적 방법으로 실현할 수 있다.
- 반복적 방법에서는 최종 대상 노드가 여러 반복 단계를 통해 결정된다.
- 직접적 방법에서는 최종 대상 노드가 하나의 단계에서 선택된다.
이 기사에서는 직접적 및 반복적 방법을 둘 다 사용하는 하이브리드 방법인 Randomized Hydrodynamic Load Balancing 방법을 사용한다.
MapReduce 프로그램은 대용량 데이터를 병렬로 계산하기 위해 설계되었다. 이를 위해서는 워크로드를 많은 시스템에 분배해야 한다. Hadoop은 이 프로그래밍 패러다임을 구현할 수 있는 시스템적인 방법을 제공한다.
계산에는 입력 키/값 쌍 세트가 사용되며 출력 키/값 쌍 세트가 결과로 출력된다. 계산에는 Map과 Reduce라는 두 가지 기본 작업이 포함된다.
사용자에 의해 작성된 Map 작업은 입력 쌍을 사용하여 중간 키/값 쌍 세트를 출력한다. MapReduce 라이브러리가 동일한 중간 Key #1에 연관된 모든 중간 값을 그룹화하여 Reduce 함수에 전달한다.
마찬가지로 사용자에 의해 작성된 Reduce 함수는 중간 Key #1과 해당 키에 대한 값 세트를 받는다. 이 함수는 이러한 값을 병합하여 가능한 한 작은 값 세트를 만든다. 일반적으로 Reduce 호출마다 0 또는 1의 출력 값이 출력된다. 중간 값은 반복자(프로그래머가 특정 구현에 상관 없이 콜렉션의 모든 요소를 이동할 수 있도록 지원하는 오브젝트)를 통해 사용자의 Reduce 함수에 제공된다. 이 방법을 사용하면 용량이 커서 메모리에 저장하기 어려운 값 목록도 처리할 수 있다.
WordCount 문제 예제를 살펴보자. 이 예제는 대용량의 문서 콜렉션에서 각 단어의 발생 수를 계산한다. Mapper 및 Reducer 함수는 Listing 1과 같다.
Listing 1. WordCount 문제의 Map 및 Reduce
mapper (filename, file-contents):
for each word in file-contents:
emit (word, 1)
reducer (word, values):
sum = 0
for each value in values:
sum = sum + value
emit (word, sum)
|
Map 함수는 각 단어 및 연관된 발생 수를 표시한다. Reduce 함수는 특정 단어에 대해 표시된 모든 계수를 합산한다. 이 기본 기능은 클러스터에서 빌드할 경우 고속 병렬 처리 시스템으로 쉽게 전환될 수 있다.
대용량 데이터에 대한 계산 수행은 이전부터 일반적으로 분산 설정에서 수행되었다. Hadoop을 차별화하는 특징은 단순화된 프로그래밍 모델에 있다. 이 모델을 사용하면 사용자가 분산 시스템을 빠르게 작성 및 테스트할 수 있고, 데이터 및 작업이 시스템에 효율적으로 자동 분배되며, CPU 코어의 기본 병렬 기능을 활용할 수 있다.
좀 더 자세히 살펴보자. 앞에서 설명한 것처럼 Hadoop 클러스터에는 다음과 같은 노드가 있다.
- NameNode(클라우드 마스터)
- DataNodes(또는 슬레이브)
클러스터의 노드에는 로컬 입력 파일이 미리 로드되어 있다. MapReduce 프로세스가 시작되면 NameNode가
JobTracker 프로세스를 사용하여 DataNode에 태스크를 할당한다. 그런 다음
DataNode에서는 TaskTracker 프로세스를 통해 태스크를 실행한다. 여러 Map
프로세스가 각 DataNode에서 실행되고 중간 결과가 Combiner 프로세스에 전달된다. 그런 다음 Combiner
프로세스가 한 시스템의 파일에 있는 단어 수를 생성한다(예를 들어, WordCount 문제의 경우). 이제 값이
섞여서 Reduce 프로세스에 전달된 후 이 프로세스에서 관심 있는 문제에 대한 최종 출력이 생성된다.
로드 밸런싱은 노드가 임계값 레벨 이상으로 로드되었을 때 여유가 있는 노드에 로드를 고르게 분배하는 유용한 기능이다. MapReduce 알고리즘의 실행에서는 로드 밸런싱이 많이 중요하지는 않지만 대용량 파일을 처리하고 하드웨어 자원 사용이 중요할 경우에는 로드 밸런싱이 매우 중요하다. 결과적으로 로드 밸런싱은 자원 중심적 상황에서 하드웨어 사용률을 향상시키는 동시에 약간의 성능 향상도 제공한다.
일부 데이터 노드의 로드 용량이 모두 찼거나 새로운 빈 노드가 클러스터에 추가될 때 Hadoop Distributed File System 클러스터의 디스크 공간 사용량을 조절하기 위한 모듈이 구현되었다. 밸런서(Class Balancer 도구)는 임계값부터 시작되며, 이 매개변수는 0%부터 100% 사이의 값으로 10%가 기본값이다. 이 값은 클러스터의 조절 여부에 대한 목표를 설정하며, 임계값이 낮을수록 클러스터의 균형이 더 세밀하게 조절된다. 또한 밸런서 실행 시간도 길어진다. (참고: 임계값이 너무 작으면 클러스터의 상태를 조절할 수 없다. 왜냐하면 애플리케이션이 파일을 동시에 쓰고 지울 수도 있기 때문이다.)
클러스터는 각 데이터 노드에서 노드의 전체 용량 대비 사용한 공간 비율(노드의 사용률)과 클러스터의 전체 용량 대비 사용한 공간 비율(클러스터의 사용률)의 차이가 임계값을 초과하지 않을 경우 균형 잡힌 상태에 있는 것으로 간주된다.
이 모듈은 사용률이 높은 데이터 노드의 블록을 사용률이 낮은 노드로 반복적으로 이동하며, 각 반복에서 노드는 노드 용량의 임계값 이하의 블록을 이동하거나 받고, 각 반복은 20분 이하로만 실행된다.
이 구현에서 노드는 highly-utilized, average-utilized 및 under-utilized로 분류된다. 각 노드의 사용률에 따라 노드 간에 로드가 전송되고 클러스터의 상태가 조절된다. 이 모듈은 다음과 같이 작동된다.
- 먼저, 주변 노드의 세부 사항을 확인한다.
- DataNode의 로드가 임계값 레벨까지 올라가면 NameNode에 요청을 보낸다.
- NameNode에는 특정 DataNode의 최인접 노드에 대한 로드 레벨 정보가 있다.
- NameNode에서 로드를 비교하여 여유가 가장 많은 주변 노드에 대한 세부 사항을 특정 DataNode에게 보낸다.
- 그런 다음 DataNode에서 다음과 같은 작업이 수행된다.
- 각 DataNode에서는 최인접 주변 노드의 로드양의 합과 자신의 로드양을 비교한다.
- DataNode의 로드 레벨이 주변 노드의 합보다 크면 로드 대상 노드(인접 노드 및 기타 노드)가 임의로 선택된다.
- 그런 다음 로드 요청이 대상 노드에 전송된다.
- 마지막으로 요청이 수신된다.
- 모든 노드에는 로드 요청을 수신하는 버퍼가 있다.
- MPI(Message Passing Interface)가 이 버퍼를 관리한다.
- 주 스레드가 버퍼링된 큐를 청취하고 수신된 요청을 처리한다.
- 노드가 로드 밸런싱 실행 단계가 들어간다.
크기가 각기 다른 다양한 입력 파일 세트가 제공되었으며 MapReduce 태스크를 단일 및 두 개의 노드로 구성된 클러스터에서 실행했다. 해당 실행 시간을 측정하여 클러스터에서 MapReduce를 실행하는 것이 대용량 입력 파일에 훨씬 더 효율적이라는 결론에 도달했다.
그림 3의 그래프에서는 다양한 노드에서 실행한 성능 결과를 보여 준다.
그림 3. 클러스터에서 더욱 효율적으로 작동되는 MapReduce 로드 밸런싱
Hadoop MapReduce 및 로드 밸런싱에 대한 실험을 통해 다음과 같은 두 가지 명백한 결론이 도출되었다.
- 클라우드 환경에서 MapReduce 구조는 대용량 데이터 세트에 대한 처리 효율을 높여 준다. 이와는 반대로 비클라우드 시스템에서는 그러한 성능 향상이 발생하지 않는다.
- 데이터 세트가 작을 경우에는 MapReduce 및 로드 밸런싱으로 인한 클라우드 시스템의 처리 효율이 기대 만큼 향상되지 않는다.
따라서 클라우드 시스템에서 대용량 데이터를 처리할 계획이 있다면 MapReduce 스타일 병렬 처리와 로드 밸런싱의 조합을 고려하는 것이 좋다.
교육
-
MapReduce에 대한 궁금증을 해소하고 싶다면 Apache.org의 Hadoop
MapReduce Tutorial을 읽어보기 바란다.
-
Hadoop에서 Map과 Reduce가 실행되는 방법을 알아보자.
-
Ricky Ho가 제공하는 "Pragmatic
Programming Techniques: Hadoop Map/Reduce Implementation"과 "Cloud
MapReduce Tricks" 블로그에서는 MapReduce에 대한 유용한 정보를 볼 수 있으며, 이 기사 또한 이러한 블로그에서
아이디어를 얻을 수 있었다.
-
원래 모델에 비해 훨씬 더 다양한 아키텍처 관점을 제공하는 또 하나의 MapReduce 프로그래밍 모델 구현인 Cloud MapReduce를 살펴보자.
-
Hadoop의
JobTracker및TaskTracker클래스에 대해 자세히 알아보자. -
developerWorks Cloud computing
사이트에서는 다음과 같은 자원을 비롯하여 클라우드 컴퓨팅에 관한 업데이트된 자원을 제공한다.
- 클라우드 컴퓨팅 환경에 대한 소개를 볼 수 있다.
- 업데이트된 기술 기사 및 튜토리얼과 팟 캐스트 및 웹 캐스트를 통해 개발 작업에 도움이 되는 정보를 얻을 수 있을 뿐만 아니라 전문가 워크숍 및 기록된 세션을 통해 효율적인 클라우드 개발자로 성장할 수 있다.
- 클라우드 환경에서 사용할 수 있도록 설계된 IBM 제품 다운로드 및 정보에 대한 연결을 볼 수 있다.
- 커뮤니티의 많은 관심을 받고 있는 주제에 적극적으로 참여하자.
-
IBM Developer Cloud Blog에서는 클라우드 컴퓨팅 전문가의
Developer Cloud에 대한 최신 정보를 볼 수 있다.
-
how-to wiki는
개발자 클라우드를 위한 일반 사용 시나리오로 항상 업데이트되고 있다.
-
developerWorks 기술 행사 및 웹 캐스트를 통해 최신 정보를 얻을 수 있다.
-
YouTube의 IBMdevcloud 채널에서는 Test Cloud의 다양한 IBM 제품에 대한 사용 방법과 인스턴스를
작성 및 액세스하는 방법을 포함한 모든 종류의 실습 데모를 볼 수 있다.
-
ibm.com/cloud 포털 사이트에서는 IBM Cloud 오퍼링에 대한 높은 수준의 개요 정보를 볼 수 있다.
제품 및 기술 얻기
-
Apache.org에서 Hadoop 0.20.1을 다운로드할 수 있다.
-
Eclipse.org에서 Eclipse IDE(버전 3.0 이상)를 다운로드할 수 있다.
- Ubuntu.com에서 Ubuntu(버전
8.2 이상)를 다운로드할 수 있다.
-
IBM Smart Business Development and Test on the IBM Cloud 사이트에서는
클라우드 애플리케이션 개발을 시작할 수 있다.
-
developerWorks에서 직접 다운로드할 수 있는 IBM
시험판 소프트웨어를 사용하여 클라우드와 관련된 후속 개발 프로젝트를 구현해 볼 수 있다.
토론
-
My developerWorks의
Developer
Cloud group은 Smart Business Development and Test on the IBM Cloud를 위한 커뮤니티이다.
-
연결, 공유 및 협업을 위한 전문가 네트워크이자 통합 커뮤니티 도구 세트인 My developerWorks를
통해 developerWorks 커뮤니티(개발자 블로그, 그룹, 포럼, 팟 캐스트, 프로파일, 뉴스레터, 위키 및 커뮤니티 주제)에 참여하자.
Kirpal A. Venkatesh is a System Engineer for Global Business Service at IBM, a practitioner in Microsoft technologies, and an enthusiastic adopter and innovator of cloud computing technology.
Kishorekumar is an IT Architect for Global Business Service at IBM. He brings more than 13 years of software development experience with a strong focus on integrating software into the Rational platform. A passionate evangelist on cloud, Kishore is a frequent participant on developerWorks. You can follow his activities through his MydW profile and blog.