hadop client 와 datanode 의 통신 프로 토 콜 분석

3460 단어 hadoopclientdatanode
본 고 는 주로 hadop 클 라 이언 트 read 와 write block 의 절차,그리고 client 와 datanode 통신 의 프로 토 콜,데이터 흐름 형식 등 을 분석 했다.
hadop 클 라 이언 트 와 namenode 통신 은 RPC 프로 토 콜 을 통과 하지만 client 와 datanode 통신 은 RPC 를 사용 하지 않 고 socket 을 직접 사용 합 니 다.그 중에서 읽 기와 쓰기 프로 토 콜 도 다 릅 니 다.본 고 는 hadop 0.20.2 버 전의(0.19 버 전도 마찬가지)client 와 datanode 통신 의 원리 와 통신 프로 토 콜 을 분석 하 였 습 니 다.  또한 강조해 야 할 것 은 0.23 및 이후 버 전에 서 client 와 datanode 의 통신 프로 토 콜 이 변화 하여 protobuf 를 직렬 화 방식 으로 사용 하 였 습 니 다.
Write block
1.클 라 이언 트 는 먼저 namenode.create 를 통 해 namenode 에 파일 생 성 을 요청 한 다음 dataStreamer 스 레 드 를 시작 합 니 다.
2.client 는 세 개의 스 레 드 를 포함 하고 main 스 레 드 는 로 컬 데 이 터 를 메모리 에 읽 고 Package 대상 으로 밀봉 하여 대기 열 dataQueue 에 넣 습 니 다.
3.dataStreamer 스 레 드 에서 대기 열 dataQueue 에 package 가 있 는 지 확인 합 니 다.있 으 면 BlockOutPutStream 대상(하나의 block 을 만 들 고 하나의 block 은 여러 개의 package 를 포함 할 수 있 습 니 다)을 만 듭 니 다.만 들 때 해당 datanode 와 통신 하여 DATA 를 보 냅 니 다.TRANSFER_HEADER 정 보 를 가 져 오고 되 돌려 줍 니 다.그리고 ResponseProcessor 스 레 드 를 만 들 고 datanode 의 반환 ack 확인 정 보 를 받 고 오류 처 리 를 합 니 다.
4.dataStreamer 는 dataQueue 에서 Package 대상 을 꺼 내 datanode 에 보 낸 다음 에 dataQueue 에 데이터 가 있 는 지 계속 순환 해서 판단 합 니 다.
다음 그림 은 write block 의 절 차 를 보 여 줍 니 다.
image
아래 그림 은 메시지 의 양식 이다.
image
Read block
주로 BlockReader 클래스 에서 이 루어 집 니 다.
newBlockReader 를 초기 화 할 때,
1.매개 변수 sock 을 통 해 new Socket OutputStream(socket,timeout)을 만 든 다음 통신 정 보 를 쓰 는 것 은 block 을 쓰 는 header 와 다 릅 니 다.
//write the header.
out.writeShort( DataTransferProtocol.DATA_TRANSFER_VERSION );
out.write( DataTransferProtocol.OP_READ_BLOCK );
out.writeLong( blockId );
out.writeLong( genStamp );
out.writeLong( startOffset );
out.writeLong( len );
Text.writeString(out, clientName);
out.flush();
2.입력 스 트림 new SocketInputStream(socket,timeout)만 들 기
3.반환 메시지 in.readShort()를 판단 합 니 다!=DataTransferProtocol.OP_STATUS_SUCCESS
4.입력 흐름 에 따라 checksum 생 성:DataChecksum checksum=DataChecksum.newDataChecksum(in)
5.첫 번 째 Chunk 의 위치 읽 기:long firstChunk Offset=in.readLong()
주:512 개의 바이트 가 하나의 chunk 로 checksum(4 개의 바이트)을 계산 합 니 다.
6.다음은 BlockReader 의 read 방법 에서 구체 적 인 데 이 터 를 읽 습 니 다:result=readBuffer(buf,off,realLen)
7.하나하나 chunk 읽 기
int packetLen = in.readInt();
long offsetInBlock = in.readLong();
long seqno = in.readLong();
boolean lastPacketInBlock = in.readBoolean();
int dataLen = in.readInt();
IOUtils.readFully(in, checksumBytes.array(), 0,
checksumBytes.limit());
IOUtils.readFully(in, buf, offset, chunkLen);
8.데 이 터 를 읽 은 후 checksum 인증;FSInputChecker.verifySum(chunkPos)

좋은 웹페이지 즐겨찾기