Map task와 Reduce task의 입출력 파일 처리
- Posted at 2006/10/23 08:06
- Filed under project/lucene_hadoop
hadoop에서는 하나의 Job이 여러개의 task로 분리되어 실행되는데 그중 Map Task의 수는 InputFormat 인터페이스의 getSplits() 메소드에서 반환되는 FIleSplit 배열의 길이를 이용한다. 아무런 설정을 변경하지 않으면 default로는 TextInputFormat가 사용되는데 이것의 getSplits() 구현은 한 파일을 64M 단위로 분리하여 하나의 Map에 할당한다.
Map task의 생성시 Map task에는 자신이 처리해야 하는 파일명과 그 파일에서 처리 시작 offset, length를 가지고 시작한다.
이럴 경우 개행문자를 이용하여 레코드를 구분하는 파일의 경우 64MB block의 경계에서는 레코드 유실이 발생하게 되는데 이것을 처리하기 위해 Map Task는 자신이 처리해야 하는 block의 마지막까지 처리한 후, 다음 block의 첫번째 레코드까지 처리한다. 파일의 첫번째 레코드가 아닌 나머지 레코드의 첫번째 레코드는 그것을 처리하는 Map task에 의해서는 무시된다. 이런 방식으로 인해 실제 getSplits()메소드에서 넘겨준 start 위치(offset), length와는 조금 다른 input 영역을 가지게 된다.
다음은 Map에서의 output이 어떻게 Reduce 에 할달되는가 하는 문제이다.
Map&Reduce의 기본 개념에 의하면 Map이 하나의 output을 만들 것으로 예상되지만, hadoop에서는 하나의 map task는 여러개의 출력 파일을 만들어 낸다. 기본적인 처리에서는 Partioner의 갯수만큼 만들어 지는데 Partnioner의 수는 Reduce의 수와 동일하다. 다음과 같은 내용으로 정리할 수 있다.
Map에서 생성하는 파일은 다음과 같은 파일명으로 Map task가 수행되는 Node의 local disk에 저장된다.
- task_jobid_m_taskid_0_파티션번호(0,1,2...)
local에 저장된 파일을 Reduce Task는 Map이 수행되는 Node에 http로 접속하여 파일을 가져온다.
- http://tasktracker_ip:port//task_jobid_m_taskid_0?reduce=reduce
TaskTracker에는 기본적으로 jetty를 이용하여 http 데몬이 수행된다.
Partioner는 Map에서 나온 레코드를 특정 Reduce에서 처리하게 할 때 유용하게 사용할 수 있다. 예를 들어 모든 레코드의 첫번째 필드가 A로 시작하는 경우 첫번째 Reduce에서 처리하게 하고, 나머지는 2번 Reduce에서 처리하게 할 수도 있다.
Reduce는 JobTracker에 의해 생성시 자신이 처리해야 할 Map의 갯수 정보만 알고 생성된다. Reduce는 Map이 수행중에는 자신이 처리해야 하는 파일을 앞에서 설명한 URL을 이용하여 계속 복사한다. 복사해야 하는 파일 수는 자신이 처리해야 하는 Map Task 수 * Reduce 수(Partioner수) 가 된다. 640MB 파일에 대한 처리의 경우 Reduce를 2로 설정하면 하나의 Reduce가 복사해야 하는 파일 수는 Map 5개 * 2(Partioner수) = 10개가 된다.
Map task에서는 Partioner 말고 Combiner라는 것이 있는 Map task의 map() 에서는 하나의 레코드만 처리하도록 되어 있는데 Combiner에서는 여러개의 레코드를 모아서 처리할 수 있도록 되어 있다. 자세한 설명은 다음 컬럼에...
Map task의 생성시 Map task에는 자신이 처리해야 하는 파일명과 그 파일에서 처리 시작 offset, length를 가지고 시작한다.
이럴 경우 개행문자를 이용하여 레코드를 구분하는 파일의 경우 64MB block의 경계에서는 레코드 유실이 발생하게 되는데 이것을 처리하기 위해 Map Task는 자신이 처리해야 하는 block의 마지막까지 처리한 후, 다음 block의 첫번째 레코드까지 처리한다. 파일의 첫번째 레코드가 아닌 나머지 레코드의 첫번째 레코드는 그것을 처리하는 Map task에 의해서는 무시된다. 이런 방식으로 인해 실제 getSplits()메소드에서 넘겨준 start 위치(offset), length와는 조금 다른 input 영역을 가지게 된다.
다음은 Map에서의 output이 어떻게 Reduce 에 할달되는가 하는 문제이다.
Map&Reduce의 기본 개념에 의하면 Map이 하나의 output을 만들 것으로 예상되지만, hadoop에서는 하나의 map task는 여러개의 출력 파일을 만들어 낸다. 기본적인 처리에서는 Partioner의 갯수만큼 만들어 지는데 Partnioner의 수는 Reduce의 수와 동일하다. 다음과 같은 내용으로 정리할 수 있다.
MapTask는 Reduce 개수 만큼 출력 파일을 생성하고,Reduce는 각 Reduce에 할당된 일련번호에 해당하는 Map의 파티셔너 출력파일을 가져와서 처리한다. 즉 하나의 Reduce는 모든 MapTask에 접속해서 파일을 가져오는데 MapTask의 출력파일 전체를 가져오는 것이 아니라 자신이 처리할 파티션 파일만 가져온다.
Map에서 생성하는 파일은 다음과 같은 파일명으로 Map task가 수행되는 Node의 local disk에 저장된다.
- task_jobid_m_taskid_0_파티션번호(0,1,2...)
local에 저장된 파일을 Reduce Task는 Map이 수행되는 Node에 http로 접속하여 파일을 가져온다.
- http://tasktracker_ip:port//task_jobid_m_taskid_0?reduce=reduce
TaskTracker에는 기본적으로 jetty를 이용하여 http 데몬이 수행된다.
Partioner는 Map에서 나온 레코드를 특정 Reduce에서 처리하게 할 때 유용하게 사용할 수 있다. 예를 들어 모든 레코드의 첫번째 필드가 A로 시작하는 경우 첫번째 Reduce에서 처리하게 하고, 나머지는 2번 Reduce에서 처리하게 할 수도 있다.
Reduce는 JobTracker에 의해 생성시 자신이 처리해야 할 Map의 갯수 정보만 알고 생성된다. Reduce는 Map이 수행중에는 자신이 처리해야 하는 파일을 앞에서 설명한 URL을 이용하여 계속 복사한다. 복사해야 하는 파일 수는 자신이 처리해야 하는 Map Task 수 * Reduce 수(Partioner수) 가 된다. 640MB 파일에 대한 처리의 경우 Reduce를 2로 설정하면 하나의 Reduce가 복사해야 하는 파일 수는 Map 5개 * 2(Partioner수) = 10개가 된다.
Map task에서는 Partioner 말고 Combiner라는 것이 있는 Map task의 map() 에서는 하나의 레코드만 처리하도록 되어 있는데 Combiner에서는 여러개의 레코드를 모아서 처리할 수 있도록 되어 있다. 자세한 설명은 다음 컬럼에...
Posted by 김형준
- Response
- No Trackback , No Comment
Trackback URL : http://www.jaso.co.kr/trackback/114






