반응형

오늘은 HDFS로부터 클라이언트가 어떤 프로세스로 데이터를 읽는지에 대해 정리해보겠습니다. 



해당 내용은 '하둡 완벽 가이드(4)' 대한 정리 내용입니다.


[ HDFS에서 파일 읽기 ]

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

2. DistributedFileSystem은 파일의 첫 번째 블록 위치를 파악하기 위해 RPC(Remote Procedure Call)를 사용하여 네임노드를 호출합니다. 네임노드는 블록별로 해당 블록의 복제본을 가진 데이터노드의 주소를 반환하는데 이때 클러스터의 네트워크 위상에 따라 클라이언트와 가까운 순으로 데이터노드가 정렬됩니다. 또한 클라이언트 자체가 데이터노드(예를 들면 맵리듀스 태스크)고 해당 블록의 복제본을 가지고 있으면 클라이언트는 로컬 데이터노드에서 데이터를 읽습니다.

3. 클라이언트는 스트림을 읽기 위해 read() 메서드를 호출합니. 파일의 첫 번째 블록의 데이터노드 주소를 저장하고 있는 DFSInputStream은 가장 가까운(첫 번째) 데이터노드와 연결합니다.

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

5. 블록의 끝에 도달하면 DFSInputStream은 데이터노드의 연결을 닫고 다음 블록의 데이터노드를 찾습니다. 클라이언트 관점에서 이러한 과정은 투명하게 전개되며 클라이언트는 단지 연속적인 스트림을 읽는 것처럼 느낍니다. 클라이언트는 스트림을 통해 블록을 순서대로 하나씩 읽고 DFSInputStream은 블록마다 데이터노드와 새로운 연결을 맺습니다. 클라이언트는 다음 블록의 데이터노드 위치를 얻기 위해 네임노드를 호출합니다.

6. 모든 블록에 대한 읽기가 끝나면 클라이언트는 FSDataInputStream의 close() 메서드를 호출합니다.


[ HDFS에서 데이터를 읽다가 데이터노드와의 통신 장애가 발생하는 경우 ]

데이터를 읽는 중에 데이터노드와 통신 장애가 발생하면 DFSInputStream은 해당 블록을 저장하고 있는 다른 데이터노드와 연결을 시도합니다. 이후 블록에 대한 불필요한 재시도를 방지하기 위해 장애가 발생한 데이터노드를 기억해둡니다. DFSInputStream은 데이터노드로부터 전송된 데이터의 체크섬도 검증합니다. 블록이 손상되었으면 DFSInputStream은 다른 데이터노드에 있는 블록의 복제본을 읽으려고 시도합니다. 물론 손상된 블록에 대한 정보는 네임노드에 보고됩니다.

[ HDFS 파일 읽기 설계의 핵심 ]

클라이언트는 데이터를 얻기 위해 데이터노드에 직접적으로 접촉하고, 네임노드는 각 블록에 적합한 데이터노드를 안내해주는 역할을 합니다. 데이터 트래픽은 클러스터에 있는 모든 데이터노드에 고르게 분산되므로 HDFS는 동시에 실행되는 클라이언트의 수를 크게 늘릴 수 있습니다. 한편으로 네임노드는 효율적인 서비스를 위해 메타데이터를 메모리에 저장하고 단순히 블록의 위치 정보 요청만 처리하며, 데이터를 저장하거나 전송하는 역할은 맡지 않으므로 클라이언트가 많아져도 병목현상은 거의 발생하지 않습니다.


포스팅을 마치도록 하겠습니다. 감사합니다:)



반응형

+ Recent posts