本文包含如下內(nèi)容:
1、BlockSend在發(fā)送數(shù)據(jù)之前讀數(shù)據(jù)文件和meta文件生成的Packet的結(jié)構(gòu)谭溉。
2痰娱、BlockSender的核心方法:sendBlock和sendPacket芽世。
前言:
BlockSender#sendBlock有幾處調(diào)用場(chǎng)景斜脂,分別是:
1、copyBlock苗踪,用于balancing颠区;
2、DataTransfer#run通铲,用于pipeline恢復(fù)過程中往新datanode傳輸已寫入數(shù)據(jù)毕莱;
3、readBlock测暗,客戶端讀數(shù)據(jù)央串;
4、scanBlock碗啄,VolumeScanner掃描塊质和。周期性掃描塊,提前發(fā)現(xiàn)block checksum異常 corrupt的塊稚字。
一饲宿、關(guān)于Packet的結(jié)構(gòu)
BlockSender從磁盤讀一個(gè)block然后發(fā)給接收者。
class BlockSender implements java.io.Closeable {}
從BlockSender發(fā)送的數(shù)據(jù)遵循下面的格式:
Data format:
ChecksumHeader format:
1字節(jié)的CheckSum類型(CRC32, CRC32C等)胆描,4字節(jié)的一個(gè)int整數(shù)用來表示多少個(gè)字節(jié)的數(shù)據(jù)生成一個(gè)checksum瘫想。
空packet用來標(biāo)記end of block以及讀完成了。
Packet包含一個(gè)packet header昌讲、checksum 和 數(shù)據(jù)国夜。
CHECKSUM_SIZE通常取決于CHECK_SUM類型,CRC32是4短绸。
客戶端會(huì)一直讀數(shù)據(jù)车吹,直到它收到了LastPacketInBlock為true或者長(zhǎng)度為0的packet。
如果沒有checksum error醋闭,客戶端會(huì)給datanode響應(yīng)OP_STATUS_CHECKSUM_OK窄驹。
PacketHeader的結(jié)構(gòu)圖:
所以一個(gè)Packet的整體結(jié)構(gòu)如下: