티스토리 뷰

728x90

 

데이터 읽기

  1. 클라이언트는 DistributedFileSystem 인스턴스인 FileSystem 객체의 open() 메소드를 호출하여 파일을 연다.
  2. DistributedFileSystem은 파일 블록의 위치를 파악하기 위해 RPC(Remote Procedure Call)을 사용하여 네임 노드를 호출한다.
  3. 네임 노드는 각 블록마다 복제본을 가진 데이터 노드의 주소를 반환한다. 이때 클러스터의 네트워크 위상에 따라 클라이언트와 가까운 순으로 데이터 노드가 정렬된다.
  4. DistributedFileSystemd은 파일 탐색을 위한 입력 스트림인 FSDataInputStream을 클라이언트에 반환한다. FSDataInputStream은 네임 노드와 데이터 노드의 통신을 처리하는 DFSInputStream으로 Wrapping 된다.
  5. 클라이언트는 스트림을 읽기 위해 read() 메소드를 호출한다.
  6. FSDataInputStream은 각 블록의 복제본을 가진 클라이언트와 가장 가까운 데이터 노드에 연결하여 파일의 데이터를 전송한다.
    클라이언트 관점에서는 이 과정이 투명하여 단순히 연속된 스트림을 읽는 것처럼 느껴진다.
  7. 모든 데이터를 읽으면 클라이언트는 FSDataInputStream의 close() 메소드를 호출한다.

클라이언트는 다음 블록의 데이터 노드 위치를 얻기 위해 블록을 순서대로 하나씩 읽고, DFSInputStream은 하나의 블록을 읽을 때마다 데이터 노드와 새로운 연결을 맺는다. 데이터를 읽다가 데이터 노드에 장애가 발생하거나 블록이 손상된 경우에는 다른 데이터 노드에 연결을 시도하여 데이터를 읽는다.

 

데이터 쓰기

  1. 클라이언트는 DistributedFileSystem의 create() 메소드를 호출하여 파일을 생성한다.
  2. DistributedFileSystem은 파일시스템의 네임스페이스에 새로운 파일을 생성하기 위해 RPC(Remote Procedure Call)을 사용하여 네임 노드를 호출한다. 이때 블록에 대한 정보는 보내지 않는다.
  3. 네임 노드는 파일이 생성될 수 있는지 검사하여 통과하면 새로운 파일의 레코드를 만들고, 그렇지 않으면 파일 생성이 실패하며 클라이언트의 IOException이 발생한다.
  4. DistributedFileSystemd은 파일 쓰기를 위한 출력 스트림인 FSDataOutputStream을 클라이언트에 반환한다. FSDataOutputStream은 네임 노드와 데이터 노드의 통신을 처리하는 DFSOutputStream으로 Wrapping 된다.
  5. 클라이언트가 데이터를 쓸 때 DFSOutputStream은 데이터를 패킷으로 분리하고, 내부의 데이터 큐로 패킷을 보낸다.
  6. DataStreamer는 데이터 큐의 패킷을 처리한다.
    (1) 네임 노드에 복제본을 저장할 데이터 노드의 목록을 요청한다. (복제 계수만큼
    (2) 목록의 데이터 노드는 파이프라인을 형성한다.
    (3) DataStreamer는 파이프라인의 첫 번째 데이터 노드로 패킷을 전송하고, 각 노드는 패킷을 저장한 후 다음 노드로 보낸다.
  7. DFSOutputStream의 ACK 큐는 데이터 노드의 승인 여부를 기다리며, 모든 노드로부터 ACK 응답을 받아야 큐에 있는 패킷이 제거된다.
  8. 데이터 쓰기 작업이 완료되면 close() 메소드를 호출한다.
    (1) 파이프라인에 남아 있는 모든 패킷을 flush 하고 ACK를 기다린다.
    (2) 모든 패킷이 완전히 전송되면 네임 노드에 "File is Complete" 신호를 보낸다.
    (3) 네임 노드는 최소한의 블록 복제가 완료되면 최종적으로 성공 신호를 반환한다.

데이터 쓰기 작업은 dfs.namenode.replication.min에 설정된 개수만큼의 블록이 저장되면 성공한 것으로 간주된다. 기본값은 1이며, 나머지 복제 작업은 비동기적으로 수행된다. 하둡은 신뢰성, 쓰기 대역폭, 읽기 성능, 분산도 등의 균형을 전체적으로 고려하여 복제본을 저장할 데이터 노드를 선택한다.

 

데이터 쓰기 중 장애가 발생하는 경우

  1. 파이프라인이 닫히고 ACK 큐에 있는 모든 패킷이 데이터 큐 앞쪽에 다시 추가된다. → 패킷이 유실되지 않는다.
  2. 정상 데이터 노드는 네임 노드로부터 새로운 ID를 받아서 장애가 발생한 데이터 노드를 제외한 나머지 데이터 노드로 새로운 파이프라인을 구성한다.
  3. 데이터는 새로운 파이프라인으로 전송되며, 네임 노드는 불완전 복제임을 인지하고 있으므로 나중에 다른 노드에 복제본이 생성되도록 조치한다. 
  4. 장애가 발생한 데이터 노드가 복구되면 불완전한 블록은 삭제된다.

 

728x90
«   2024/05   »
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
공지사항
링크
Total
Today
Yesterday