티스토리 뷰

오늘은 HDFS에 저장된 파일을 조회하는 과정을 단계별로 알아보겠습니다.


  • 파일 조회 요청


클라이언트는 입력 스트림 객체를 이용하여, HDFS에 저장된 파일을 조회할 수 있습니다. 그림1은 클라이언트가 입력 스트림 객체를 생성하는 과정을 나타냅니다.


3_6_new.jpg


[그림1] 파일 조회 요청 과정


  1. 클라이언트는 DistributedFileSystem의 open 메소드를 호출하여, 스트림 객체 생성을 요청합니다.


  1. DistributedFileSystem은 FSDataInputStream 객체를 생성합니다. 이때 FSDataInputStream는 DFSDataInputStream과 DFSInputStream를 차례대로 래핑합니다. DistributedFileSystem은 마지막에 래핑이 되는 DFSInputStream을 생성하기 위하여, DFSClient의 open 메소드를 호출합니다.


  1. DFSClient는 DFSInputStream을 생성합니다. 이때 DFSInputStream은 네임노드의 getBlockLocations 메소드를 호출하여, 조회 대상 파일의 블록 위치 정보를 조회합니다. 참고로 DFSInputStream은 한 번에 모든 블록을 조회하지 않고, 기본 블록 사이즈의 10배수만큼 블록을 조회합니다. 예를 들어 HDFS의 기본 블록 사이즈가 64MB이면, 640MB의 블록을 조회합니다.


  1. 네임노드는 조회 대상 파일의 블록 위치 목록을 생성한 후, 목록을 클라이언트에 가까운 순으로 정렬을 합니다. 정렬이 완료되면, DFSInputStream에 정렬된 블록 위치 목록을 반환합니다.


  • 블록 조회


이번에는 클라이언트가 실제 블록을 조회하는 과정을 알아보겠습니다. 그림2는 클라이언트가 로컬 서버와 원격 서버에 있는 블록을 조회하는 과정을 나타냅니다.


3_7_new.jpg


[그림2] 블록 조회 과정


  1. 클라이언트는 입력 스트림 객체의 read 메소드를 호출하여, 스트림 조회를 요청합니다.


  1. DFSInputStream은 첫 번째 블록과 가장 가까운 데이터노드를 조회한 후, 해당 블록을 조회하기 위한 리더기를 생성합니다. 클라이언트와 블록이 저장된 데이터노드가 같은 서버에 있다면 로컬 블록 리더기인 BlockReaderLocal을 생성하고, 데이터노드가 원격에 있을 경우에는 RemoteBlockReader를 생성합니다.


  1. DFSInputStream은 리더기의 read 메소드를 호출하여, 블록을 조회합니다. BlockReaderLocal는 로컬 파일 시스템에 저장된 블록을 DFSInputStream에게 반환합니다. 그리고 RemoteBlockReader는 원격에 있는 데이터노드에게 블록을 요청하며, 데이터노드의 DataXceiverServer가 블록을 DFSInputStream에게 반환합니다. 참고로 DFSInputStream는 조회한 데이터의 체크섬을 검증하며, 체크섬에 문제가 있을 경우에는 다른 데이터노드에게 블록 조회를 요청합니다.


  1. DFSInputStream은 파일을 모두 읽을 때까지, 계속해서 블록을 조회합니다. 만약 DFSInputStream이 저장하고 있던 블록을 모두 읽었는데도, 파일을 모두 읽지 못했다면, 네임노드의 getBlockLocations 메소드를 호출하여, 필요한 블록 위치 정보를 다시 요청합니다. 위와 같이 파일을 끊김없이 연속적으로 읽기 때문에, 클라이언트는 스트리밍 데이터를 읽는 것처럼 처리할 수 있습니다.


  1. 네임노드는 DFSInputStream에게 클라이언트에게 가까운 순으로 정렬된 블록 위치 목록 반환합니다.


  • 입력 스트림 닫기


클라이언트가 모든 블록을 읽게 되면, 입력 스트림 객체를 닫아야 합니다. 그림3은 입력 스트림을 닫는 과정을 나타냅니다.


3_8_new.jpg

[그림3] 입력 스트림 닫기


  1. 클라이언트는 입력 스트림 객체의 close 메소드를 요청하여, 스트림 닫기를 요청합니다.


  1. DFSInputStream은 데이터노드와 연결되어 있는 커넥션을 종료합니다. 그리고 블록 조회용으로 사용했던 리더기도 닫아줍니다.


저작자 표시 비영리 변경 금지
신고
댓글
댓글쓰기 폼