맵 작업은 일반적으로 한 번에 입력 블록을 처리합니다 (기본 FileInputFormat 사용). 파일이 매우 작고 많은 파일이있는 경우 각 맵 작업은 입력을 거의 처리하지 않으며 많은지도 작업이 있으며 각 작업은 별도의 부기 오버 헤드를 부과합니다. 16GB 64MB 블록으로 나누어 진 1GB 파일과 10,000KB 정도의 100KB 파일을 비교하십시오. 10,000 개의 파일은 각각 하나의 맵을 사용하며 작업 시간은 단일 입력 파일을 사용하는 동일한 시간보다 수십 또는 수백 배 느려질 수 있습니다.
In your case 60 map are used in 60 files and used 60 blocks.
당신이 TextInputFormat 같은 것을 사용하는 경우, 문제는 각 파일이 적어도 1 분할을 가지고, 그래서지도의 수의 상한은 경우에 당신이 가지고있는 파일의 수이며, 많은 아주 작은 파일 들로서 당신은 각각의 아주 작은 데이터를 처리하는 많은 매퍼로 끝날 것입니다.
, 즉 매퍼의 수는 파일의 수의 독립적 인 것 형식, 그래서 당신은 동일한 분할 (I 블록 크기 제한까지 생각)에 여러 개의 파일을 포장합니다 CombineFileInputFormat를 사용해야합니다, 그에게 해결하려면 단순히 데이터 양에 따라 달라집니다.
CombineFileInputFormt에서 확장하여 사용자 정의 입력 형식을 만들어야합니다. 구현은 here입니다. InputFormat을 정의한 후 CombinedInputFormat 링크처럼 호출하면 다음과 같이 작업하여 사용하도록 지시 할 수 있습니다.
job.setInputFormatClass(CombinedInputFormat.class);