Hadoop의 InputSplit
- 개발관련팁/Hadoop
- 2011. 7. 10.
hadoop은 기본적으로 input split에 의해 계산된 각 split에 대해 하나의 map task를 생성한다. (여담이지만, 실제 map task의 개수는 mapred.map.tasks의 값이나 setNumMapTasks() 에 의해 결정되지 않는다. 자세한 이야기는 여기 참조)
InputSplit은 딱 두 개의 method를 가진 abstract class로 정의되어 있고, 각 method는 다음과 같다.
- public abstract long getLength(); // split의 size를 반환
- 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에게 작업을 제출할 때 계산된다.
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번인지 헷갈려서 조사해봄.