1.1 包名
org.apache.hadoop.fs.filestatus
1.2 格式
filestatus{path=hdfs://192.x.x.x:9000/hadoop-2.7.1.tar.gz; isdirectory=false; length=210606807; replication=3; blocksize=134217728; modification_time=xxx; access_time=xxx; owner=xxx; group=supergroup;
permission=rw-r--r--; issymlink=false}
2.1 包名
org.apache.hadoop.fs.blocklocation
2.2 調用處
jobclient的writenewsplits方法,其中調用了list<inputsplit> splits = input.getsplits(job)方法,在getsplits方法中調用了getfilelocation()。
2.3 格式
total block num:2
0,134217728,192.x.x.x
檔案在block中的偏移量0, 長度134217728
134217728,76389079,192.x.x.x
檔案在block中的偏移量134217728, 長度76389079
splits數組資訊
[hdfs://192.x.x.x:9000/hadoop-2.7.1.tar.gz:0+134217728,
hdfs://192.x.x.x:9000/hadoop-2.7.1.tar.gz:134217728+31987190]
3.1 包名
org.apache.hadoop.hdfs.protocol.locatedblocks
3.2 調用處
在hdfs讀取檔案時調用openinfo()方法,最終調用的是dfsinputstream的fetchlocatedblocksandgetlastblocklength方法擷取塊資訊locatedblocks。塊的資訊非常詳盡,如塊名稱,大小,起始偏移量,ip位址等。
在hadoop中寫檔案實際是把block寫入到datanode中,而namenode是通過datanode定期的彙報得知該檔案到底由哪幾個block組成的。是以在讀某個檔案時可能存在datanode還未彙報給namenode的情況,是以在讀檔案時隻能讀到最後一個彙報的block塊。islastblockcomplete可以辨別是否讀取到最後的塊。若不是則會根據中繼資料提供的block的pipeline來到datanode上獲得block的寫入長度,并指派給lastblockbeingwrittenlength。
3.3 格式