# hadoop\_hdfs

## 하둡과 HDFS

### Hadoop

* ![image](https://user-images.githubusercontent.com/47103479/229268412-4e0dbbfd-de8e-4d7d-ae0f-27e8b6d3e736.png)
  * <https://www.oreilly.com/library/view/data-lake-for/9781787281349/8df0cc52-432d-4233-9b6e-8f9649280b37.xhtml>
* 2005년 더크 커팅이 오픈 소스로 공개한 하둡은 분산 저장 파일시스템인 HDFS와 분산 병렬 처리를 담당하는 맵리듀스로 구성되어 있습니다. 하둡이 나온 후 이를 기반으로 피그, 하이브, HBase, 스쿱, 플룸 등의 오픈 소스 기술이 등장했고, 이들을 모두 결합한 빅데이터 기술은 통칭하여 하둡 에코시스템이라고 부르게 되었습니다.
* 아파치 하둡 플랫폼(Hadoop)은 막대한 볼륨의 데이터를 저장할 수 있는 구글 파일 시스템과 이러한 데이터를 빠르고 안정적으로 처리할 수 있는 구글 맵리듀스(Google MapReduce) 기술의 오픈소스 버전으로 많은 기업들이 빠르게 증가하는 데이터(구조적, 반구조적, 비구조적)를 관리하기 위해 하둡을 채택했습니다.
* 하둡은 잡을 맵 태스크와 리듀스 태스크로 나누어 실행하며 각 태스크는 YARN을 이용하여 스케줄링되고 클러스터의 여러 노드에서 실행됩니다. 특정 노드의 태스크 하나가 실패하면 자동으로 다른 노드를 재할당하여 다시 실행됩니다.
* 구성 요소
  * Hadoop Common
    * 하둡의 다른 모듈을 지원하기 위한 공통 컴포넌트 모듈
  * Hadoop HDFS
    * 분산 파일시스템으로 여러 개의 서버를 하나의 서버처럼 묶어서 데이터를 저장
  * Hadoop YARN
    * 하둡의 클러스터 자원 관리 시스템, 클러스터의 자원을 요청하고 사용하기 위해 API를 제공
  * Hadoop Mapreduce
    * 분산되어 저장된 데이터를 병렬 처리할 수 있게 해주는 분산 처리 모듈
* 핵심 원리
  * Failure Tolerance (장애 허용)
  * Load Balancing (로드 밸런싱)
  * Data Loss (데이터 로스)
* 이점
  * Resilience (탄력성)
  * Scalability(확장성) : 어떠한 클러스터 환경에서도 적용 가능하다.
  * Low Cost(저비용)
  * Speed(속도)
  * Data Diversity(데이터 다양성)

### HDFS

* 네트워크로 연결된 여러 머신의 스토리지를 관리하는 파일시스템. HDFS(Hadoop Distributed FileSystem)라는 분산 파일시스템을 제공합니다.
* ![image](https://user-images.githubusercontent.com/47103479/229268438-d461e961-8dc9-460e-9a17-0c4559e5be1c.png)
  * <https://www.oreilly.com/library/view/distributed-computing-in/9781787126992/3275691a-477f-4e3a-a00c-9a64bda93b16.xhtml>
  * HDFS 클러스터는 마스터-워커 패턴으로 동작하는 두 종류의 노드, 마스터인 하나의 네임노드와 워커인 여러 개의 데이터노드로 구성되어 있으며 네임노드는 파일시스템의 네임스페이스를 관리합니다.
  * 네임 노드 : 데이터 노드들의 위치나 데이터 내용에 대한 구성을 가진 한 개의 노드로 구성
  * 데이터 노드 : 데이터 수집된 다량의 내용을 가진 데이터 노드
  * 메타데이터 관리 : 메타데이터는 파일이름, 파일크기, 파일생성시간, 파일접근권한, 파일 소유자 및 그룹 소유자, 파일이 위치한 블록의 정보 등으로 구성됩니다. 각 데이터노드에서 전달하는 메타데이터를 받아서 전체 노드의 메타데이터 정보와 파일 정보를 묶어서 관리
* 하둡 디스크 상의 거대한 연속 데이터 블럭을 스캔하는 데 최적화된 분산, 무 정지 파일시스템. HDFS는 클러스터에 분산되어 데이터 저장소의 수평확장성을 제공합니다. HDFS 파일 블럭은 하드 드라이브나 전체 시스템에 문제가 생겼을 때 데이터 유실을 막기 위해 클러스터 상에 복제됩니다.
* 3가지 특징
  * Data Locality (데이터 지역성) : 하둡은 HDFS 내의 입력 데이터가 있는 노드에서 맵 태스크를 실행할 때 가장 빠르게 작동합니다. 클러스터의 중요한 공유 자원인 네트워크 대역폭을 사용하지 않는 방법
  * Replicated Blocks (복제 블럭)
  * High Probability (높은 가능성)
* HDFS 설계
  * 범용 하드웨어로 구성된 클러스터에서 실행되고 스트리밍 방식의 데이터 접근 패턴으로 대용량 파일을 다룰 수 있도록 설계된 파일시스템
  * 설계 특성
    * 매우 큰 파일
    * 스트리밍 방식의 데이터 접근
    * 범용 하드웨어
      * 하둡은 노드 장애가 발생할 확률이 높은 범용 하드웨어(여러 업체에서 제공하는 쉽게 구할 수 있는 하드웨어)로 구성된 대형 클러스터에서 문제없이 실행되도록 설계
  * HDFS가 잘 맞지 않는 응용 분야
    * 빠른 데이터 응답시간
      * HDFS는 높은 데이터 처리량을 제공하기 위해 최적화되어 있고 이를 위해 응답 시간을 희생합니다. HBase가 하나의 대안이 될 수 있습니다.
    * 수많은 작은 파일
    * 다중 라이터와 파일의 임의 수정
      * HDFS는 단일 라이터로 파일을 씁니다. 한 번 쓰고 끝나거나 파일의 끝에 덧붙이는 것은 가능하지만 파일에서 임의 위치에 있는 내용을 수정하는 것은 허용하지 않으며 다중 라이터도 지원하지 않습니다.
* HDFS 고가용성
  * 네임노드는 여전히 단일 고장점(single point of failure - SPOF), 네임노드는 메타데이터와 파일 블록의 매핑 정보를 보관하는 유일한 저장소이기 때문에 네임노드에 장애가 발생하면 맵리듀스 잡을 포함 하여 모든 클라이언트가 파일을 읽거나 쓰거나 조회할 수 없게 됩니다.
  * 새로운 네임노드는 네임스페이스 이미지를 메모리에 로드하고 -> 에디트 로그를 갱신하고 -> 전체 데이터노드에서 충분한 블록 리포트를 받아 안전 모드를 벗어날 때까지 그 어떤 요청도 처리하지 못합니다.
  * HDFS 고가용성(high availability -HA)을 지원합니다. 고가용성은 활성대기상태로 설정된 한 쌍의 네임노드로 구현되며 활성네임노드에 장애가 발생하면 대기 네임노드가 그 역할을 이어받아 큰 중단 없이 클라이언트의 요청을 처리합니다.
* 장애복구와 펜싱
  * 대기 네임노드를 활성화시키는 전환 작업은 장애복구 컨트롤러라는 새로운 객체로 관리됩니다.
  * 장애복구는 정기적인 유지관리를 위해 관리자가 수동으로 초기화할 수 있습니다.
  * 우아한 장애복구(graceful failover) : 장애복구 컨트롤러는 두 개의 네임노드가 서로 역할을 바꾸게 하는 방법으로 전환 순서를 제어할 수 있습니다.

## Reference

* <https://www.oreilly.com/library/view/hadoop-the-definitive/9780596521974/>
* <https://www.oreilly.com/library/view/programming-hive/9781449326944/>
