하둡 분산 파일 시스템 Yonsei University 2nd Semester, 2014 Sanghyun Park * The slides are from the book “시작하세요! 하둡 프로그래밍: 기초부터 실무까지 하둡의 모든 것” written by 정재화 (위키북스, 2012)
목차 HDFS의 설계 목표 HDFS 아키텍쳐 파일 저장 파일 읽기 보조 네임노드
HDFS의 설계 목표 (1) 장애 복구 스트리밍 방식의 데이터 접근 분산 서버 간에 주기적으로 상태를 체크해 빠른 시간에 장애를 인지하고, 대처할 수 있게 도와줌 스트리밍 방식의 데이터 접근 HDFS에 파일을 저장하거나, 저장된 파일을 조회하려면 스트리밍 방식으로 데이터에 접근해야 함 HDFS는 기존 파일 시스템과는 달리 배치 작업에 적합하도록 설계돼 있고, 낮은 데이터 접근 지연 시간보다는 높은 데이터 처리량에 중점을 두고 있음
HDFS의 설계 목표 (2) 대용량 데이터 저장 데이터 무결성 높은 데이터 전송 대역폭과 하나의 클러스터에서 수백 대의 노드를 지원할 수 있어야 함 하나의 인스턴스에서는 수백만 개 이상의 파일을 지원함 데이터 무결성 HDFS는 한 번 저장한 데이터는 더는 수정할 수 없고, 읽기만 가능하게 해서 데이터 무결성을 유지함 데이터 수정은 불가능하지만 파일 이동, 삭제, 복사할 수 있는 인터페이스를 제공함 하둡 2.0 알파버전부터는 HDFS에 저장된 파일에 append가 제공됨
HDFS 아키텍처 (1) HDFS는 블록 구조의 파일 시스템임 블록 사이즈는 기본적으로 64MB로 설정돼 있으며 변경 가능함 분산된 서버에 나눠서 데이터를 저장하기 때문에 로컬 서버의 하드디스크보다 큰 사이즈의 데이터를 저장할 수 있음 HDFS는 스트리밍 방식으로 로컬 디스크에 저장된 데이터를 순차적으로 검색할 수 있게 해 줌
HDFS 아키텍처 (2) 다음 그림은 320MB의 파일을 HDFS에 저장했을 때 블록이 복제되는 것을 나타냄
HDFS 아키텍처 (3) HDFS의 파일 복제 구조
HDFS 아키텍처 (4) HDFS는 마스터와 슬레이브 아키텍쳐로 구성됨 마스터 역할을 하는 네임노드 서버가 한 대, 슬레이브 역할을 하는 데이터노드 서버가 여러 대로 구성됨 네임노드는 HDFS의 모든 메타데이터를 관리하고, 클라이언트가 HDFS에 저장된 파일에 접근할 수 있게 해줌 HDFS에 저장할 때, 블록으로 나눠진 데이터는 여러 대의 데이터노드에 분산 저장됨 사용자가 구현한 애플리케이션은 HDFS에 파일을 저장하거나, 저장된 파일을 읽기 위해 HDFS 클라이언트를 사용하며, 클라이언트는 API 형태로 사용자에게 제공됨 다음 그림은 이러한 HDFS 아키텍쳐를 나타낸 것임
HDFS 아키텍처 (5)
HDFS 아키텍처 (6) HDFS는 계층형 파일 시스템을 지원하기 때문에 클라이언트는 HDFS에 디렉토리를 만들고, 이 디렉토리에 파일을 저장할 수 있음 디렉토리명과 파일명 같은 파일 시스템의 네임스페이스는 네임노드의 메타데이터에 저장됨 해당 파일의 복제본의 수와 블록의 위치도 네임노드의 메타데이터에서 관리됨
HDFS 아키텍처 (7) 데이터노드는 주기적으로 네임노드에게 하트비트와 블록의 목록이 저장된 블록 리포트를 보내줌 네임노드는 하트비트를 통해 데이터노드가 정상 동작하는지 확인함 네임노드는 블록 리포트를 통해 데이터노드의 모든 블록을 확인하고, 파일의 복제본 위치를 결정함 클라이언트는 네임노드에 접속해 원하는 파일이 저장된 블록의 위치를 조회하고, 해당 블록이 저장된 데이터노드에서 직접 데이터를 조회함
파일 저장 (1) 아래 그림은 파일 저장에 대한 동작 방식을 나타낸 것이며, 다음과 같은 단계로 진행됨
파일 저장 (2) 사용자 어플리케이션이 클라이언트에게 파일 저장을 요청함 클라이언트는 네임노드에게 사용자가 요청한 파일 경로를 생성할 것을 요청함 네임노드는 해당 파일 경로가 기존에 존재할 경우 에러 처리를 함. 기존에 존재하지 않는다면 메모리에 파일 경로를 생성한 후, 다른 클라이언트가 해당 경로를 수정하지 못하게 락을 검 네임노드는 클라이언트에게 해당 파일을 저장할 데이터노드의 목록을 반환함 (환경설정 파일 내의 “블록의 복제 개수”만큼) 클라이언트는 첫 번째 네임노드에게 데이터를 전송함
파일 저장 (3) 첫 번째 데이터노드는 전송받은 데이터를 로컬 디스크에 저장한 후, 두 번째 데이터노드로 데이터를 전송함 두 번째 데이터노드도 전송 받은 데이터를 로컬에 저장한 후, 세 번째 데이터노드로 데이터를 전송함 세 번째 데이터도 전송 받은 데이터를 로컬에 저장함 두 번째와 세 번째 데이터노드는 첫 번째 데이터노드에게 로컬 저장이 완료됐다는 사실을 알려줌 첫 번째 데이터노드는 클라이언트에게 파일 저장이 완료됐음을 응답함 클라이언트는 어플리케이션에게 파일 저장이 완료됐음을 응답함
파일 읽기 (1) 아래 그림은 파일 읽기에 대한 동작 방식을 나타낸 것이며, 다음과 같은 단계로 진행됨
파일 읽기 (2) 사용자 어플리케이션이 클라이언트에게 파일 읽기를 요청함 클라이언트는 네임노드에게 어플리케이션이 요청한 파일이 어떤 블록에 저장돼 있는지 블록의 위치 정보를 요청함 네임노드는 요청된 파일의 복제 블록이 저장된 위치를 메타데이터를 통해 확인한 후 해당 데이터노드의 목록을 반환함. 이 때 데이터노드의 목록은 요청 중인 클라이언트와 가까운 순서대로 정렬해서 반환됨 클라이언트는 데이터노드에게 블록을 조회할 것을 요청함 데이터노드는 클라이언트에게 요청한 데이터를 전송함 클라이언트는 어플리케이션에게 전송 받은 데이터를 전달함
보조 네임노드 (1) 네임노드는 HDFS의 메타데이터를 관리하기 위해 에디트 로그(EditLog)와 파일 시스템 이미지(FsImage) 파일을 사용함 에디트 로그는 HDFS의 메타데이터에 대한 모든 변화를 기록하는 로그 파일로서, 네임노드의 로컬 파일시스템에 파일로 저장됨 HDFS에 새 파일을 저장하거나, 기존 파일을 삭제하거나, 파일 위치를 변경하는 등의 파일 상태를 변화시키는 모든 액션이 에디트 로그에 기록됨 파일 시스템 이미지 파일은 파일 시스템의 네임스페이스(디렉토리명, 파일명, 상태정보)와 파일에 대한 블록 매핑 정보를 저장하는 파일로서, HDFS의 스냅샷이라고 할 수 있음 파일 시스템 이미지 파일도 네임노드의 로컬 파일시스템에 파일로 저장됨
보조 네임노드 (2) 네임노드가 구동할 경우 다음과 같은 단계로 파일 시스템 이미지 파일과 에디트 로그를 사용함 로컬에 저장된 파일 시스템 이미지 파일과 에디트 로그 파일을 조회함 (메모리로 읽어 들임) 에디트 로그 파일에 있는 내용을 바탕으로 메모리에 올라와 있는 파일 시스템 이미지를 갱신함 메모리에 올라와 있는 파일 시스템 이미지를 로컬에 있는 파일 시스템 이미지 파일에 적용함 에디트 로그 파일을 초기화함
보조 네임노드 (3) 보조 네임노드는 체크포인팅이라는 작업을 통해 네임노드의 파일 시스템 이미지 파일의 크기를 축소하는 역할을 함 그래서 보조 네임노드를 흔히 체크포인트 서버라고 표현함 (보조 네임노드는 네임노드의 백업 서버가 아님) 보조 네임노드의 체크포인팅 과정은 설명을 생략함