티스토리 뷰
HDFS
HDFS(Hadoop Distributed File System)는 범용 하드웨어에서 동작하고, 장애 복구성을 가지는 분산 파일 시스템을 목표로 한다.
HDFS는 실시간 처리보다는 배치처리를 위해 설계되었다. 따라서 빠른 데이터 응답시간이 필요한 작업에는 적합하지 않다. 또한 네임노드가 단일 실패 지점(SPOF)이 되기 때문에 네임노드 관리가 중요하다.
특징
- 블록 단위 저장
- 데이터를 블록 단위로 나누어서 저장한다. 블록 사이즈보다 작은 파일은 기존 파일의 사이즈로 저장하고, 블록 사이즈보다 큰 크기의 데이터파일은 블록 단위로 나누어 저장한다.
- 예를 들어 블록의 단위가 128MB일 때, 200MB의 데이터를 저장하기 위해서는 128MB 데이터 블록 하나와 72MB 데이터 블록 하나로 나누어서 저장된다.
- 블록 복제를 이용한 장애 복구
- HDFS는 장애 복구를 위해 각 블록을 복제하여 저장한다.
- 복제의 기본 단위는 3이다.
- 하나의 블록은 3개의 블록으로 복제되고, 같은 랙(Rack)의 서버와 다른 랙(Rack)의 서버로 복제되어 저장된다.
- 따라서 1G 데이터를 저장할 때 데이터가 복제되어 3G의 저장공간이 필요하다.
- 블록에 문제가 생기면 복제한 다른 블록을 이용해서 데이터를 복구한다.
- 읽기 중심
- HDFS는 데이터를 한 번 쓰면 여러 번 읽는 것을 목적으로 한다. 따라서 파일의 수정은 지원하지 않는다.
- 데이터 지역성
- MapReduce는 HDFS의 데이터 지역성을 이용해서 처리 속도를 증가시킨다.
- 처리 알고리즘이 있는 곳에 데이터를 이동시키지 않고, 데이터가 있는 곳에서 알고리즘을 처리하여 대용량 데이터를 이동시키는 비용을 줄일 수 있다.
구조 (Architecture)
HDFS는 마스터-슬레이브 구조로 하나의 네임노드와 여러 개의 데이터 노드로 구성된다. 네임 노드는 메타데이터를 가지고 있고 데이터는 블록 단위로 나누어 데이터 노드에 저장된다. 사용자는 네임 노드를 이용해 데이터를 읽고 쓸 수 있다.
네임 노드
네임 노드의 주요 역할은 메타데이터 관리와 데이터 노드의 관리이다.
메타데이터 관리
메타데이터는 파일이름, 파일크기, 파일생성시간, 파일접근권한, 파일 소유자 및 그룹 소유자, 파일이 위치한 블록의 정보 등으로 구성된다. 각 데이터 노드에서 전달하는 메타데이터를 받아서 전체 노드의 메타데이터 정보와 파일 정보를 묶어서 관리한다.
- 메타데이터 파일 종류
- Fsimage 파일
- 네임스페이스와 블록 정보
- Edits 파일
- 파일의 생성, 삭제에 대한 트랜잭션 로그
- 메모리에 저장하다가 주기적으로 생성
- Fsimage 파일
- 메타데이터
- VERSION: 현재 실행 중인 HDFS의 ID, 타입 등 정보
- edits_0000xxx-0000xxx: 트랜잭션 정보. edits_트랜잭션시작번호-트랜잭션종료번호 까지의 정보를 저장
- eidts_inprogress_000xx: 최신 트랜잭션 정보. 압축되지 않은 정보
- fsimage_000xxx: 000xxx 까지 트랜잭션 정보가 처리된 fsimage
- fsimage_000xxx.md5: fsiamge의 해쉬값
- seen_txid: 현재 트랜잭션 ID
데이터 노드 관리
네임 노드는 데이터 노드가 주기적으로 전달하는 heartbeat(3초, dfs.heartbeat.interval)와 block report(dfs.blockreport.intervalMsec)를 이용하여 데이터 노드의 동작상태, 블록상태를 관리한다.
- 하트비트
- 데이터 노드가 동작 중이라는 것을 네임 노드가 알 수 있다. 하트비트가 도착하지 않으면 네임 노드는 데이터 노드가 동작 하지 않는 것으로 간주하고, 더이상 I/O가 발생하지 않도록 조치한다.
- 블록 레포트
- 블록 레포트를 이용하여 HDFS에 저장된 파일에 대한 최신 정보를 유지한다. 데이터 노드에 저장된 블록 목록과 각 블록이 로컬 디스크의 어디에 저장되어 있는지에 대한 정보를 가지고 있다.
데이터 노드
데이터 노드는 파일을 저장하는 역할을 한다. 파일은 블록 단위로 저장된다. 하트비트를 네임노드에 주기적으로 전달함으로써 동작 여부를 판단한다. 블록 레포트로 블록의 변경사항을 체크하고, 네임 노드의 메타 데이터를 갱신한다.
데이터 노드 상태
데이터 노드의 상태를 나타내는 정보는 활성 상태
와 운영 상태
로 구분한다.
- 활성 상태
- 데이터 노드가
Live
인지Dead
인지를 나타낸다. 히트비트를 주기적으로 전달하여 살아 있는지 확인되면live
상태이다. 데이터 노드에 문제가 발생하여 지정한 시간(dfs.namenode.stale.datanode.interval)동안 하트비트를 받지 못하면 네임 노드는 데이터 노드의 상태를Stale
상태로 변경한다. 이후 지정한 시간동안 응답이 없으면dead
노드로 변경한다.
- 데이터 노드가
- 운영 상태
- 데이터 노드의 업그레이드, 패치 같은 작업을 하기 위해 서비스를 잠시 멈춰야 할 경우 블록을 안전하게 보관하기 위해 설정한다.
- NORMAL: 서비스 상태
- DECOMMISSIONED: 서비스 중단 상태
- DECOMMISSION_INPROGRESS: 서비스 중단 상태로 진행 중
- IN_MAINTENANCE: 정비 상태
- ENTERING_MAINTENANCE: 정비 상태로 진행 중
네임 노드 구동 과정
네임 노드는 다음의 순서로 구동된다.
- Fsimage를 읽어 메모리에 적재한다.
- Edits 파일을 읽어 변경 내역을 반영한다.
- 현재의 메모리 상태를 스냅샷으로 생성하여 Fsimage 파일을 생성한다.
- 데이터 노드로부터 block report를 수신하여 매핑 정보를 생성한다.
- 서비스를 시작한다.
파일 읽기 / 쓰기
- 읽기
- 네임 노드에 파일이 보관된 블록 위치를 요청.
- 네임 노드가 블록 위치를 반환.
- 각 데이터 노드에 파일 블록을 요청. 노드의 블록이 깨져 있으면 네임 노드에 이를 통지하고 다른 블록을 확인한다.
- 쓰기
- 네임 노드에 파일 정보를 전송하고, 파일의 블록을 써야할 노드 목록을 요청.
- 네임 노드가 파일을 저장할 목록을 반환.
- 데이터 노드에 파일 쓰기 요청. 데이터 노드간 복제 진행.
'Data Engineering > Hadoop' 카테고리의 다른 글
[Hadoop] MapReduce (0) | 2022.12.17 |
---|---|
[HDFS] Federation, 고가용성, 세이프모드, 데이터 블록 관리 (0) | 2022.10.25 |
하둡(Hadoop)이란? (0) | 2022.10.23 |
- Total
- Today
- Yesterday
- kubernetes
- 네트워크
- DFS
- logstash
- 빅데이터를지탱하는기술
- mahout
- 프로그래머스
- 빅데이터
- GROK
- 백준
- sqoop
- heapq
- Hadoop
- oozie
- Elasticsearch
- elasticsaerch
- 이코테
- CS
- 파이썬
- Python
- Flutter
- Algorithm
- DP
- BOJ
- CSAPP
- HDFS
- cka
- OS
- Espher
- kafka
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |