Hadoop의 InputSplit

hadoop은 기본적으로 input split에 의해 계산된 각 split에 대해 하나의 map task를 생성한다. (여담이지만, 실제 map task의 개수는 mapred.map.tasks의 값이나 setNumMapTasks() 에 의해 결정되지 않는다. 자세한 이야기는 여기 참조)

InputSplit은 딱 두 개의 method를 가진 abstract class로 정의되어 있고, 각 method는 다음과 같다.

  1. public abstract long getLength();          // split의 size를 반환
  2. public abstract String[] getLocations(); //split의 data가 저장된 node들을 반환

실제 split을 구현한 class로 FileSplit class가 있다. (DB에 있는 data 역시 input split으로 쓰일 수 있는 모양이지만, 실제로 hadoop에 구현된 class는 없는 듯..)

FileSplit은 아래와 같은 member variable을 가지는데,,

  • private Path file          //파일 이름
  • private long start        // 파일에서 처리할 바이트의 첫 시작 위치
  • private long length      // 처리할 바이트 수
  • private String[] hosts  // 실제 해당 block을 가지고 있는 host들의 list

이러한 InputSplit들은 mapreduce job을 실행하는 단계에서 보면 4. submit job 단계에서 계산이 된다. 즉, JobClient가 JobTracker에게 작업을 제출할 때 계산된다.

image

Firgure 6-1. How Hadoop runs a MapReduce job. 출처 : Hadoop The definite Guide

 

그런데 막상 코드를 보면, 위 그림에서처럼 딱 무 자르듯이 나눠져 있는 건 아니고, 3번 단계에서 job에 필요한 리소스 (jar 파일들, 설정 파일 등등) 들을 hdfs의 특정 경로에 복사를 하는데, 이 특정 경로에 계산된 inputsplit 정보들도 같이 복사가 된다.

그리고 6. retrieve input splits 단계에서는 3~4번 단계에서 복사된 input split가 담긴 파일들을 가져와서 map task에서 넘겨주는 구조임.

input split을 계산하는 단계가 4번인지 6번인지 헷갈려서 조사해봄.

댓글

Designed by JB FACTORY