2014-01-21 2 views

답변

0

귀하의 질문에 대한 답변은 매우 복잡합니다. 대부분의 경우, Hadoop의 사용자 또는 HDFS의 관리자이기 때문에 NameNode가 블록을 쓸 노드를 정확하게 결정할 필요가 없을 것입니다. 하둡 확실한 가이드의 'Anatomy of a File Write'에서

: 그러나 당신이 정말로 궁금하다면, 다음 리소스를 살펴 걸릴

클라이언트를 ( DistributedFileSystem에) (작성 호출하여 파일을 만듭니다 그림 3-3의 1 단계). DistributedFileSystem 은 namenode에 대한 RPC 호출을 수행하여 파일 시스템의 네임 스페이스에 새 파일을 만듭니다.이 파일에는 연결된 블록이 없습니다 (2 단계). namenode는 파일에 이 이미 존재하지 않으며 클라이언트가 파일을 으로 만들 수있는 권한이 있는지 확인하기 위해 다양한 검사를 수행합니다. 이러한 검사가 통과되면 namenode는 새로운 파일을 기록합니다. 그렇지 않으면 파일 작성이 실패하고 클라이언트는 IOException을 던집니다. DistributedFileSystem은 클라이언트가 데이터 쓰기를 시작하기 위해 FSDataOutputStream 을 반환합니다. 읽기 경우와 마찬가지로 FSDataOutputStream은 데이터 노드 및 namenode와 통신하는 DFSOutputStream을 래핑합니다.

클라이언트가 데이터를 쓰면 (3 단계) DFSOutputStream이 패킷을 패킷으로 분할하여 데이터 큐라는 내부 큐에 씁니다. 데이터 큐는 DataStreamer에 의해 소비됩니다. 복제본을 저장하기에 적합한 데이터 노드 의 목록을 선택하여 namenode에 새 블록을 할당하도록 요청하는 책임입니다. 데이터 노드 목록은 파이프 라인을 형성합니다. 우리는 복제 수준이 3이라고 가정 할 것이므로 파이프 라인에 노드가 세 개 있습니다 ( ). DataStreamer는 패킷을 으로 스트리밍하고 패킷을 저장하는 파이프 라인의 첫 번째 데이터 노드에 파이프 라인의 두 번째 데이터 노드에 을 전달합니다. 마찬가지로 두 번째 데이터 노드는 패킷을 저장하고이를 파이프 라인의 세 번째 (및 마지막) 데이터 노드로 전달합니다.

당신이 그것을 단계별하려는 경우에도 최신 안정 ASF 하둡에서 소스 코드를 확인할 수 있습니다 https://github.com/apache/hadoop-common/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java#L346

+0

당신이 jtravaglini 하라구요 –

관련 문제