Hadoop

Hadoop - HDFS, 네임노드, 데이터 노드, NFS

개발 일기92 2024. 5. 21. 13:48

- 블록 Block

한 번에 읽고 쓸 수 있는 데이터의 최대량.

기본적으로 128MB

블록 크기보다 작은 데이터일 경우, 전체 블록 크기에 해당하는 하위 디스크를 모두 점유하지는 않는다.

ex) 1MB크기의 파일을 저장한다면 128MB의 디스크를 사용하는 것이 아니라 1MB의 디스크만 사용한다.

 

- 블록이 큰 이유?

탐색 비용을 최소화 하기 위해서이다. 블록이 크면 블록을 탐색하는데 걸리는 시간을 줄일 수 있고 데이터를 전송하는데 더 많은 시간을 할애할 수 있다.

디스크에서 한 블록을 읽는데 걸리는 시간은 

Seek time + Transfer time

(데이터의 시작점을 찾는 시간 + 블록의 크기)

 

여기서 transfer rate는 디스크의 물리적인 한계가 있으므로 더 빠르게 만들기는 어려우니 블록의 크기를 크게 만들면 transfer time이 크게 늘어나 한 블록을 읽는 시간에 seek time은 무시해도 될 정도로 작은 값으로 취급할 수 있다.

그러므로 블록을 크게 만들면 대용량 데이터를 읽을 때 seek time의 영향이 줄어들고 디스크의 물리적인 속도인 transfer rate과 데이터를 읽는 속도가 거의 비슷해진다.

 

파일 시스템에 있는 각 파일을 구성하는 블록의 목록을 출력하는 명령어

 hdfs fsck / -files -blocks

 

HDFS클러스터는 두종류의 노드(마스터인 하나의 네임노드 / 워커인 여러개의 데이터노드)로 구성되어있다.

 

네임노드는 파일시스템의 네임스페이스를 관리하며 메타데이터를 유지한다. 이는 네임스페이스 이미지와 에디트 로그라는 두 종류의 파일로 로컬 디스크에 영속적으로 저장된다. 또한 파일에 속한 모든 블록이 어느 데이터 노드에 있는지 파악한다. 하지만 블록의 위치 정보는 시스템이 시작할때 모든 데이터노드로부터 받아서 재구성하기때문에 디스크에 영속적으로 저장하지는 않는다.

 

HDFS 클라이언트는 사용자를 대신해서 네임노드와 데이터 노드 사이에서 통신하고 파일 시스템에 접근한다. 실제로 클라이언트는 인터페이스를 제공하기 때문에 사용자는 각 노드와 관련된 함수를 몰라도 코드를 작성할 수 있다.

 

데이터 노드는 실질적인 일꾼이다. 클라이언트나 네임노드의 요청이 있을때 블록을 저장하고 탐색하며 저장하고 있는 블록의 목록을 주기적으로 네임노드에 보고한다.

 

네임노드가 없으면 파일시스템은 동작하지 않는다. 네임 노드를 실행하는 머신이 손상되면 파일 시스템의 어떤 파일도 찾을 수 없다. 

 

네임노드의 장애복구 기능 

  1. 이를 위해 파일 시스템의 메타 데이터를 지속적인 상태로 보존하기 위해 파일로 백업한다. 네임노드가 다수의 파일시스템에 영구적인 상태를 저장하도록 하둡을 구성. 백업 작업은 동기화되고 원자적으로 실행된다. 주로 권장하는 방법은 로컬 디스크와 원격의 NFS 마운트 두곳에 동시에 백업하는 것이다.
  2. 보조 네임노드를 운영하는 것이다. 보조 네임노드의 주 역할은 에디트로그가 너무 커지지 않도록 주기적으로 네임 스페이스 이미지를 에디트 로그와 병합하여 새로운 네임스페이스 이미지를 만드는 것이다. 병합 작업을 수행하기 위해 보조 네임노드는 충분한 CPU와 네임노드와 비슷한 용량의 메모리가 필요하므로 별도의 물리머신에서 실행되는 것이 좋다. 또한 보조 네임노드는 주 네임노드에 장애가 발생할 것을 대비해서 네임 스페이스 이미지의 복제본을 보관한다. 그러나 해당 백업 작업은 약간의 시간차를 두고 진행되므로 주 네임노드에 장애가 발생하면 어느정도의 데이터 손실은 불가피하다.
    • NFS에 저장된 메타데이터 파일을 보조 네임노드로 복사하여 새로 병합된 네임스페이스 이미지를 만들고 그것을 새로운 주 네임노드에 복사한 다음 실행하게 된다.

 

출처 : https://hazel-developer.tistory.com/303