前言:
本篇文章主要回答了如下問題:
① HDFS客戶端寫數(shù)據(jù)時怎么界定一個DFSPacket對象是此block里的最后一個DFSPacket狡相?
② DFSPacket對象里的lastPacketInblock何時設置為true的茶袒?
一溯壶、前置補充知識:
使用過HDFS API創(chuàng)建新文件镣屹,然后向這個新文件寫數(shù)據(jù)的朋友一定知道圃郊。創(chuàng)建文件(create)的API會給我們返回一個輸出流。參考下圖野瘦,是 org.apache.hadoop.fs. FileSystem
類給我們定義的創(chuàng)建文件的API及其部分重載函數(shù)描沟。
我們拿到這個輸出流之后,調用write相關的方法往里面寫數(shù)據(jù)鞭光,最后close流。就完成了整個創(chuàng)建泞遗、寫入的全過程惰许。
那其實在調用write相關方法后,HDFS Client幫我們封裝了很多細節(jié)史辙。這里簡單提一些本文中會用到的概念:
- DataStreamer :負責向pipeline里的datanodes發(fā)送數(shù)據(jù)包汹买。調用輸出流的write方法會把數(shù)據(jù)放到DataStreamer的dataQueue這個鏈表數(shù)據(jù)結構里。
- DFSPacket : 即DataStreamer發(fā)送的數(shù)據(jù)包對象 聊倔。
- ResponseProcessor:相應處理器線程晦毙,用于處理DFSPacket的響應ack信息。直白點講就是:我把數(shù)據(jù)發(fā)出去了耙蔑,我得知道它的狀態(tài)见妒,發(fā)送成功了還是發(fā)送失敗了。
二甸陌、DFSPacket對象簡要介紹
DFSPacket有如下這些成員變量: