天天看點

Hadoop中的FileStatus、BlockLocation、LocatedBlocks、InputSplit1 FileStatus2 BlockLocation3 LocatedBlocks

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 格式

繼續閱讀