<hdfs>
ㅇ 저장할 수 있는 파일 수는 네임노드의 메모리 용량에 좌우됨 : 파일시스템의 메타데이터를 메모리에서 관리
ㅇ disk block : 한번에 읽고 쓸 수 있는 데이터의 최대량
- filesystem block : 디스크 블록 크기의 정배수. 기본 512bytes이며 보통 수 kbytes
- hdfs : hdfs의 파일은 특정 블록 크기의 chunk로 쪼개지고 독립적으로 저장됨
filesystem에서 file은 disk block보다 파일이 작아도 파일 크기를 block 만큼 점유하지만, hdfs는 그렇지 않으며 block size가 매우 큼
(기본 128mb)
ㅇ hdfs의 block size가 큰 이유 : 탐색 비용의 최소화
ㅇ 맵리듀스의 맵 태스크는 기본적으로 한 번에 하나의 블록을 처리
<hdfs cluster>
master-worker 패턴으로 동작
ㅇ namenode(master)
- 파일시스템의 네임스페이스를 관리
- 파일시스템 트리, 트리에 포함된 파일 & 디렉토리의 메타데이터를 유지(namespace image, edit log 파일로 로컬에 저장)
- 파일에 속한 모든 블록이 어느 데이터노드에 있는지 파악(시스템 시작 시 데이터노드로부터 정보를 받아 재구성)
- 네임노드 장애 시 파일시스템이 동작하지 않으므로 장애복구 기능을 제공(파일 백업, secondary namenode 운영)
- hdfs federation : 네임스페이스 정보를 각각의 네임노드가 나누어서 관리(2.x부터 지원)
ㅇ datanode(worker)
- 클라이언트, 네임노드에서 요청이 있을 때 블록을 저장하고 탐색
- 저장하고 있는 블록 목록을 주기적으로 네임노드에 보고
<Map Reduce>
ㅇ Map
- Reduce에 데이터를 제공
- 잘못된 레코드를 거르거나 필수 값 누락 데이터 제거 등 전처리작업에 적합
- 입력 데이터가 있는 노드에서 맵 태스크를 실행할 때 가장 빠름(데이터 지역성 최적화 - 네트웍 대역폭 미사용)
- Reduce로 입력을 보내기 전 Key-Value 쌍은 Reduce를 실행할 노드에서 Key를 기준으로 정렬되고 그룹화됨(suffle)
ㅇ Reduce
- 정렬되고 그룹화된 value들에 대해 연산을 수행
<Job>
ㅇ 클라이언트가 수행하는 작업의 기본 단위
ㅇ 입력 데이터, M/R Program, 설정 정보로 구성
ㅇ 하둡은 Job을 Map task와 Reduce task로 나누어 실행
ㅇ 각 task는 yarn을 이용하여 스케쥴링되고 클러스터의 여러 노드에서 실행됨
ㅇ 잡의 입력을 입력 스플릿(input split) 혹은 스플릿이라는 고정 크기 조각으로 분리함. 스플릿마다 하나의 Map Task를 생성하고 스플릿의 각 레코드를 사용자 정의 맵 함수로 처리.
ㅇ 스플릿이 작을 수록 부하분산에 좋은 효과를 볼 수 있으나 너무 작을 경우 스플릿 관리 및 맵 태스크 생성을 위한 오버해드가 생겨 실행시간이 증가함. 일반적인 잡의 적절한 스플릿 크기는 hdfs 블록의 기본 크기가 적당하다고 알려져 있음
<MR, Tez>
ㅇ 맵의 결과물은 로컬에 저장되나, 셔플 후 Reduce 결과물은 hdfs에서 저장됨
ㅇ MR을 여러번 할 경우 hdfs에 저장하는 단계에서 I/O 오버헤드가 발생
ㅇ Tez는 I/O 오버헤드를 줄이기 위해 중간 리듀스 결과를 메모리에 저장
ㅇ Hive에서 실행엔진으로 MR대신 사용할 수 있음
출처 : 하둡 완벽 가이드 4판, https://wikidocs.net/23569