간단한 단위작업을 반복해서 처리할때 사용하는 프로그래밍 모델, 그리고 그 모델을 구현한 프레임워크이다. 페타바이트 이상의 대용량 데이터를 분산/병렬 처리하기 위해 별도 모델까지 필요해졌다.
간단한 단위작업을 처리하는 Map작업과, 작업의 결과물을 모아서 집계하는 Reduce 단계로 구성되어 있다.
참고로 요즘에는 거의 안쓰인다. 더 좋은 대체제들이 많이 나왔음. MapReduce vs Spark 를 보자.

하둡 v1에서는 작업단위를 job이라고 했지만, 하둡 v2부터는 YARN아키텍쳐가 도입되면서 작업단위를 애플리케이션이라고 부르기 시작했다.
애플리케이션은 맵 태스크와 리듀스 태스크로 나뉜다.
각 태스크들은 attempt단위로 실행되고 관리된다.
따라서 하둡 애플리케이션은 생성되면 application_xxx_xxx 라는 식별자를 갖고, 애플리케이션에서 생성되는 태스크들은 생성되면 attempt_xxx_xxx 라는 식별자를 갖는다.
맵태스크에 입력된 데이터는 입력분할(inputSplit)단위로 분할된다. 큰 데이터를 여러 노드에 분할해 동시에 병렬처리하기 위함임.
스플릿의 크기는 트레이드오프가 있다. 스플릿이 너무 작으면 작업 부하가 분산되어 성능은 높아질 수 있지만, 작업의 개수가 증가하고 작업생성을 위한 오버헤드가 증가한다. 보통 HDFS블록의 기본크기인 128MV를 인풋스플릿 크기로 잡는다.
이보다 커지면 데이터지역성이 떨어져 성능에 손해가 생길 수도 있음. 또한 HDFS내의 네트워크 대역을 이용해 노드간 통신해야 할 수도 있어 비용이 든다.