HDFS Architecture(3) - File Read/Write

Alan·2023년 3월 5일
0

Read Process

  1. 클라이언트가 DistributedFileSystem object의 open() 메소드로 HDFS 파일을 읽겠다고 요청

  2. DistributedFileSystem은 RPC(Remote Procedure Call)로 namenode에 연결. open 대상이 되는 파일의 메타데이터를 조회하며, 한 번에 모든 블록정보를 리턴하지 않고 처음 몇개의 블록 주소를 리턴

  3. 메타데이터 요청에 대한 응답으로 해당 블록(copy본 포함)을 가진 datanode 주소가 리턴

  4. Datanode 주소정보를 토대로 FSDataInputStream 객체를 만들어 client에 전달. FSDataInputStream은 datanode 및 namenode와 상호작용할 수 있는 DFSInputStream을 가짐. 클라이언트가 DFSInputStream에 대해 read() 메소드를 호출하고 대상 파일의 첫 번째 블록이 있는 datanode와 connection. 이때 연결하는 대상은 primary datanode로 가장 가까운 데이터 노드를 의미

  5. 데이터는 read() 메소드를 반복해서 호출하며, Stream 형태로 리턴됨. read 과정은 end of block에 도달할 때까지 지속

  6. end of block에 도달하면 DFSInputStream은 datanode와의 연결을 끊고, 해당 파일의 다음 블록이 위치한 데이터 노드와 연결. 이 과정은 해당 파일의 모든 블록을 읽을 때까지 지속

  7. read 과정이 끝나면 client는 close()로 모든 연결과 스트림을 닫고 끝냄

Write Process

  1. 새로운 파일 생성은 client가 DistributedFileSystem object에서 create()호출로 시작

  2. DistributedFileSystem object는 RPC로 namenode에 연결, 새로운 파일 생성을 시작함. 이때 namenode는 새로운 파일 생성 요청에 대한 verification 진행. 이미 파일이 존재하는지, 요청 유저가 해당 경로에 대한 권한이 있는지 등. verification에 실패하면 client는 IOException을 받음. 성공하면 namenode에서 해당 파일 record가 생성됨

  3. namenode에서 파일 record가 생성되면 클라이언트에 FSDataOutputStream object가 리턴되며, write를 수행함

  4. FSDataOutputStream은 namenode 및 datanode와 상호작용할 수 있는 DFSOutputStream을 가지며, DFSOutputStream은 client가 데이터를 write하기 위한 packet을 생성. 해당 packet은 DataQueue에 들어감

  5. DataStreamer은 namenode에 새 블록 할당을 요청하고, 복제에 사용할 바람직한 datanode를 선택

  6. 복제 과정은 datanode들로 파이프라인을 생성하며 시작. 위 그림의 경우 replication-factor가 3이기 때문에 파이프라인에 3개의 datanode가 존재

  7. DataStreamer는 DataQueue로부터 데이터를 consume해서 파이프라인의 첫번째 datanode에 저장할 packet을 전송

  8. 하나의 파이프라인으로 묶인 모든 데이터노드는 저장을 위해 받은 packet을 모두 저장하고, 이것을 파이프라인의 다음 데이터노드로 forward 함

  9. DFSOutputStream의 Ack Queue는 datanode로부터 acknowledgement를 받으면 저장되는 queue임

  10. 파이프라인의 모든 데이터노드로부터 ack가 queue에 들어오면 Ack Queue는 삭제됨. 만약 하나의 datanode라도 데이터 저장과 ack 전송에 실패하면 Ack Queue에 받은 packet 정보를 보고 재시작할 수 있음

  11. client의 write 작업이 끝나면 close() 메소드가 호출되며, close는 남은 모든 data packet을 flush하고 ack를 기다림

  12. 마지막 ack가 도착하면 클라이언트는 namenode에 write작업이 끝났음을 알림

0개의 댓글