SyntaxHighlighter.all();

1. 파일 읽기

HDFS로부터 데이터를 읽고 있는 클라이언트, 하둡완벽가이드

위의 그림은 클라이언트가 HDFS, 네임노드, 데이터노드와 상호작용하는 것을 보여준 것이다.

                                                     FSDataInputStream - 파일 탐색을 지원하는 입력 스트림

1. 열기

     클라이언트는 HDFS가 DistributedFileSystem 인스턴스인 FileSystem 객체의 open() 메서드를 호출하여 파일을 연다

 

2. 블록 위치 얻기

      DistributedFileSystem은 파일의 첫 번째 블록 위치를 파악하기 위해 RPC를 사용하여 네임노드를 호출

      이때, 클러스터의 네트워크 위상에 따라 클라이언트와 가까운 순으로 데이터 정렬됨

            (클라이언트 자체가 데이터노드고 해당 블록의 복제본 소유시 클라이언트는 로컬 데이터노드에서 데이터 읽음)

      DistributedFileSystem은 클라이언트가 데이터를 읽을 수 있도록 FSDataInputStream을 반환

 

3. 읽기

      FSDataInputStream은 데이터노드와 네임노드의 I/O를 관리하는 DFSInputStream을 래핑

      클라이언트는 스트림을 읽기위해 read() 메서드 호출

 

4~5. 블록 읽기

    파일의 첫번째 블록의 데이터노드 주소를 저장하고 있는 DFSInputStream은 가장 가까운 데이터노드와 연결

    해당 스트림에 대해 read() 메서드를 반복적으로 호출하면 데이터노드에서 클라이언트로 모든 데이터 전송됨

    블록의 끝에 도달하면 DFSInputStream은 데이터노드의 연결을 닫고 다음 블록의 데이터노드를 찾음

 

-> 새로운 블록 읽을 때 마다 DFSInputStream은 데이터노드와 새로 연결함

    클라이언트는 다음 블록의 데이터노드 위치를 얻기 위해 네임노드를 호출 => 2~(4,5) 반복

 

6. 닫기

    모든 블록을 읽었으면 FSDataInputStream의 close() 메서드 호출

 

* 장애 발생시!!!!

  DFSInputStream은 해당 블록을 저장하고 있는 다른 데이터노드와 연결 시도
  이후 블록에 대한 블필요한 재시도 방지하기위해 장애 발생한 데이터 노드 기억
          -> DFSInputStream은 데이터노드로부터 전송된 데이터의 체크섬 검증,
              블록 손상시 다른 데이터노드에 있는 블록 복제본 읽으려함, 손상된 블록정보는 네임노드에 보고됨

 

=> 핵심! 클라이언트는 데이터를 얻기위해 데이터노드에 직접적으로 접촉,

            네임노드는 각 블록의 적합한 데이터노드를 안내

 

 

 

 

 

2. 파일 쓰기

데이터를 HDFS로 쓰고 있는 클라이언트

파일생성 -> 데이터입력 -> 파일닫기

1. 생성

    클라이언트는 DistributedFileSystem의 create()를 호출하여 파일 생성

 

2. 생성

    DistributedFileSystem은 파일시스템의 네임스페이스에 새로운 파일 생성하기 위해 네임노드에 RPC요청을 보냄

    블록에 대한 정보 보내지 않음

   네임노드는 요청한 파일과 동일한 파일이 존재하는지, 클라이언트가 파일을 생성할 권한이 있는지 등 검사를 수행

             -> 검사통과시 네임노드는 새로운 파일의 레코드 생성,

                 검사실패시 파일 생성 실패, 클라이언트의 IOException이 발생

  DistributedFileSystem은 클라이언트가 데이터를 읽을 수 있도록 FSDataOutputStream을 반환

 

3. 쓰기

    FSDataOutputStream은 데이터노드와 네임노드의 I/O를 관리하는 DFSOutputStream을 래핑

    클라이언트가 데이터를 쓰면 DFSOutputStream이 일함!

 

4. 패킷쓰기

    (1) 클라이언트가 데이터를 쓰면(3단계) DFSOutputStream은 데이터를 패킷으로 분리하고,

       데이터 큐(내부 큐)로 패킷을 보냄

    (2) DataStreamer는 데이터 큐에 있는 패킷을 처리

    (3) 네임노드에 복제본을 저장할 데이터노드의 목록 요청

          -> 데이터노드 목록에 포함된 노드는 파이프라인 형성 (목록의 개수 = 파이프라인 속 노드 개수)

    (4) DataStreamer는 파이프라인의 첫 번째 데이터노드로 패킷전송

    (5) 첫 번째 데이터노드는 각 패킷을 저장한 후 파이프라인의 두 번째 데이터노드로 보냄

    (6) 쭉쭉쭉 마지막노드까지 보냄

 

5. ack패킷

    DFSOutputStream은 데이터노드의 승인 여부를 기다리는 ack 큐(내부 패킷 큐)를 유지함

    ack 큐에 있는 패킷은 파이프라인의 모든 데이터노드로부터 ack 응답을 받아야 제거됨

 

6. 닫기

    데이터 쓰기를 완료할 때 클라이언트는 스트임에 close() 메서드를 호출

    close()메서드 : 데이터노드 파이프라인에 남아 있는 모든 패킷을 플러시하고 승인이 나기를 기다림

 

7. 완료

    모든 패킷이 완전히 전송되면 네임노드에 '파일완료' 신호를 보냄

        (네임노드는 DataStreamer를 통해 블록 할당 요청을 받았기 때문에

          파일의 블록 구성을 알고있으며, 최소한의 블록 복제가 완료되면 최종적으로 성공 신호 반환)

 

* 장애 발생시!!!!   => 장애복구작업
    
     (1) 파이프라인이 닫힘
     (2) ack 큐에 있는 모든 패킷은 데이터 큐 앞 쪽에 다시 추가
              -> 다운스트림노드가 실패해도 패킷 유실 안됨
     (3) 정상 데이터노드는 네임노드로부터 새로운 ID 다시 받음
     (4) 장애 데이터노드는 파이프라인에서 제거, 정상인 나머지 데이터노드로 새로운 파이프라인 구성
               -> 네임노드는 해당 블록이 불완전 복제라는 것을 인식하고 있으므로
                   나중에 다른 노드에 복제본이 생성되도록 조치

    

    - 장애 발생 데이터노드가 나중에 다시 복구되면 불완전한 블록은 삭제됨

 

 

3. 병렬복사 (distcp)

위의 내용은 단일-스레드 접근

distcp : 병렬로 다량의 데이터를 하둡파일시스템으로 복사하기 위한 프로그램

          hadoop fs -cp 대체..

 

1) HDFS 클러스터 균형 유지

   - 데이터를 HDFS로 복사할 때는 클러스터의 균형을 고려

           -> HDFS는 클러스터 전반에 걸쳐 파일 블록이 고르게 분산되었을 때 가장 잘 동작하기 때문에 

 

'빅데이터 > 하둡' 카테고리의 다른 글

[하둡] 7. YARN- 맵리듀스 1과의 차이  (0) 2020.07.01
[하둡] 6. YARN  (0) 2020.06.29
[하둡] 3. HDFS (하둡 분산 파일시스템) - 설계 및 개념  (0) 2020.06.19
[하둡] 2. 맵리듀스  (1) 2020.06.18
[하둡] 1. 하둡  (1) 2020.05.25

+ Recent posts