HDFS Client
File Reading
- JVM 기반의 Client가 NameNode에 원하는 데이터를 요청한다.
- NameNode는 메타데이터 안에서 해당 데이터를 담고 있는 DataNode들의 IP 주소(위치 정보)를 전달한다.
- 분산 네트워크의 코어 스위치(core switch)를 통해 IP 주소를 라우팅하여 목표 DataNode를 찾는다.
- Rack(세부 분산 네트워크)의 코어 스위치에서 최종적으로 목표 노드를 찾고 요청에 대한 반환값을 받는다.
블록 병렬 읽기 (Parallel Read)
최적의 DataNode 선택: 클라이언트는 NameNode로부터 받은 블록 위치 목록을 바탕으로, 자신과 가장 가까운 DataNode를 선택하여 해당 블록을 읽기 위한 연결을 설정합니다. (데이터 지역성 원칙 적용)
DataNode 직접 통신: 클라이언트는 NameNode를 거치지 않고, 선택한 DataNode와 직접 통신하여 해당 블록의 데이터를 요청.
병렬 읽기: 파일이 여러 블록으로 나뉘어 있으므로, 클라이언트는 이 블록들을 여러 DataNode에서 동시에(병렬로) 읽어올 수 있다. 이것이 HDFS의 높은 처리량을 가능하게 하는 핵심 요소.
- 최종 결합 및 반환 (Reassembly)
클라이언트 측에는 HDFS 파일 시스템 인터페이스(DFSInputStream 등)가 구현되어 있습니다. 이 인터페이스는 병렬적으로 들어오는 블록 데이터 스트림들을 받아, 파일이 저장될 때의 원래 순서에 따라 논리적으로 재조립합니다.
재조립된 최종 파일 데이터 스트림이 사용자 프로그램(애플리케이션)에 하나의 연속된 파일처럼 반환됩니다.
File Writing
- Client는 NameNode에 파일 정보를 전송하고, 파일 Block을 쓸 DataNode 목록을 요청한다.
- NameNode가 파일을 저장할 DataNode의 목록을 반환한다.
- DataNode에 파일 쓰기를 요청한다.
- DataNode간 복제를 같이 진행한다.
- 목적지 DataNode에 데이터를 쓰기 시작하고, 다른 DataNode에 복제 데이터를 완료하면 쓰기 작업이 완료된다.