這篇文章介紹了DFSPacket對(duì)象的lastPacketInBlock字段相關(guān)的知識(shí)。
【HDFS Client】DFSPacket對(duì)象什么情況下是lastPacketInBlock?
本文繼續(xù)深挖這個(gè)字段在HDFS Client寫數(shù)據(jù)時(shí)的重要作用。
可以這么說,如果這個(gè)lastPacketInBlock出問題的話,是會(huì)影響增量塊匯報(bào)(IBR)的,繼而導(dǎo)致Block Missing丟塊的問題。
我們先給出結(jié)論,lastPacketInBlock的兩個(gè)重要作用:
1、在客戶端側(cè)控制endBlock,結(jié)束一個(gè)block,進(jìn)而向namenode新申請(qǐng)新的塊。
2、在datanode側(cè),控制block的finalize。
一、DataNode側(cè)的作用
因?yàn)閘ast packet in block只是一個(gè)標(biāo)記packet,并沒有真實(shí)的數(shù)據(jù)。
所以,在datanode側(cè),如果發(fā)現(xiàn)當(dāng)前receive的packet是lastPacketInBlock的話,就會(huì)看是否有sync標(biāo)記,
如果需要sync block,則flushOrSync(true, seqno),把塊給同步到磁盤上。
if (lastPacketInBlock || len == 0) {
if(LOG.isDebugEnabled()) {
LOG.debug("Receiving an empty packet or the end of the block " + block);
}
// sync block if requested
if (syncBlock) {
flushOrSync(true, seqno);
}
}
DataNode側(cè)的PacketResponder線程接收到下游的PipelineAck之后,拿到lastPacketInBlock標(biāo)記。
如果為true。則調(diào)用finalizeBlock方法,去finalizeBlock,closeBlock,觸發(fā)IBR(notifyNamenodeReceivedBlock)通知NameNode。如下代碼所示: