최초 작성일 : 2013/03/07 13:07 


Input and Output type


MapReduce 라이브러리는 몇가지 서로 다른 형식의 입력 파일을 읽을 수 있다.

예를들면 "text"모드의 입력은 각각의 행이 key/value 쌍으로 취급된다. key는 파일상의

위치(행)가 되고 value는 그 행의 내용이 되는 것이다.

일반적으로 지원하는 또다른 형식은 일련의 key/value 쌍을 key로 정렬하여 저장한다.


각각의 입력 형식의 구현은 분산된 map task에서의 처리를 위해 어떤식으로 의미있는

단위로 분할해야 하는가를 알고있다 (예를들면 text 모드에서는 행 단위로 영역이 구분되므로

행 단위로 분할을 하게 되는 것이다).


대부분의 사용자들은 이미 정의된 소수의 입력 형식을 사용하겠지만 사용자들은 간단하게 reader 인터페이스를

구현함으로써 새로운 입력 형식을 추가로 제공할 수 있다.


reader 인터페이스는 파일로부터 데이터를 읽어들이는데만 필요한 것은 아니다.

예를들면  데이터베이스로부터 레코드를 읽어들인다거나 메모리에 매핑된 데이터 구조로부터 데이터를

읽어들이는 기능을 정의하기도 쉽다.


이와 비슷하게 우리는 서로 다른 형식으로부터 만들어진 데이터를 위한 출력 형식도 제공하고 있으면

이 역시 입력 형식과 마찬가지로 사용자가 새로운 출력 형식을 추가할 수 있다.


Side-effects (부작용)


때때로 MapReduce 사용자들은 사용하는 map이나 reduce 작업으로부터 추가적인 출력으로

보조 파일을 생성하는 것이 편리하다는 것을 알게된다. 우리는 이러한 부작용이 단편적이고 서버의

상태를 바꾸지 않도록(*idempotent) 하는데 애플리케이션 개발자들에게 의존할 수 밖에 없다.


일반적으로 애플리케이션은 임시 파일에 작성되며 이 파일이 완전하게 생성되었을 때 단 한 번 이름이 바뀌게 된다.


우리는 하나의 task로부터 생성된 여러개의 출력 파일들에 대해 2단계의 commit을 수행하는 것을 허용하지 않는다.

따라서 다수의 파일을 생성하고 그 파일들 간의 일관성이 요구되는 task들은 반드시 동일한 결과를 출력해야 한다.

이러한 제약은 실제 사용상에는 아무런 문제가 되지 않는다.


Skipping Bad Records


때때로 사용자들의 코드에는 버그가 있고 이는 확실해 보이는 레코드처리시 Map 또는 Reduce 함수가

죽는 원인이 된다. 이러한 버그는 MapReduce 수행이 완전하게 종료되는 것을 방해한다.

보통의 상황이라면 버그를 수정해야 한다. 그러나 때때로 수정이 불가능하거나 수정하지 않아도 되는 경우도 있다.

대체로 버그가 소스를 수정할 수 없는 외부 업체의 라이브러리내에 있는 경우가 그러할 것이다.

또 다른 경우에는 커다란 데이터 셋을 이용하여 통계적인 분석을 하는 경우처럼  몇몇 레코드를 무시하는 선에서

(버그가)용인될 수도 있다.


우리는 MapReduce 라이브러리에서 결정적인 문제를 일으킨 레코드를 감지하고 이를 걸러내어

다음 단계를 진행할 수 있도록  프로그램을 실행에 대한 몇가지 선택적인 설정을 제공하고 있다.


각각의 작업자 프로세스는 각각의 분할 영역에서의 오류나 전송 오류를 잡아내는 signal handler를 설치한다.

사용자의 Map이나 Reduce 수행을 호출하기 전에 MapReduce 라이브러리는 전역 변수에 전달 받은 인자의

순번을 저장한다. 사용자의 코드가 signal를 발생시키면 이 signal handler는 앞서 저장한 순번을 포함하고 있는

마지막 순간의 UDP 패킷을 MapReduce의 master에게 보낸다. master가 특정 레코드에 대해 1개 이상의

오류를 가지고 있을 경우 master는 해당 Map 또는 Reduce task가 재실행 될 때  그 레코드가 걸러져야 함을

알려주게 된다.


Local Execution


Map 또는 Reduce 함수 내의 디버깅 문제는 실제 연산이 분산 환경(때로는 수 천대에 이르는)에서 이루어지는데다가

작업 할당의 결정이 master에 의해 동적으로 이루어지기 때문에 다루기가 까다롭다.


쉬운 디버깅이나 profiling, 소규모 테스트를 돕기 위해 우리는 MapReduce 라이브러리에

로컬 머신에서 MapReduce 수행의 모든 작업을 순차적으로 진행할 수 있도록 대안을 마련해놓았다.


사용자들에게 제공된 컨트롤들은 특정 map task를 위한 연산에서는 제약적일 수 있다.

사용자들은 특정 플래그를 이용하여 자신들의 프로그램을 호출할 수 있고 자신에게 유용한 디버깅 툴이나

테스트 툴을 쉽게 사용할 수 있다.


* idempotent(멱등 :冪等) 메서드를 여러 번 호출하여 한 번만 호출한 것과 동일한 결과가 나오는 경우. 읽기 전용 메서드와 같이 서버 측의 어떠한 상태도 변화시키지 못하는 모든 메서드는 idempotent임

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^