假設客戶端應用程序使用FileSplit
對象來讀取相應文件中的實際字節。Hadoop FileSplit reading
爲了這樣做,一個InputStream
對象必須被從FileSplit
創建的,通過這樣的代碼:
FileSplit split = ... // The FileSplit reference
FileSystem fs = ... // The HDFS reference
FSDataInputStream fsin = fs.open(split.getPath());
long start = split.getStart()-1; // Byte before the first
if (start >= 0)
{
fsin.seek(start);
}
流的調整由-1存在於像Hadoop
MapReduce
LineRecordReader
類的一些場景。然而,FSDataInputStream
seek()
方法的文檔明確指出,在尋找位置之後,下一次讀取將來自該位置,這意味着(?)上面的代碼將是1字節關閉(?)。
所以,問題是,所有InputSplit閱讀案例都需要「-1」調整嗎?
順便說一句,如果有人想正確讀取FileSplit
,尋求其啓動是不夠的,因爲每個拆分也有一個結束可能不是實際的HDFS文件的結尾相同。所以,相應的InputStream
應「界定」,即具有最大的長度,如下所示:
InputStream is = new BoundedInputStream(fsin, split.getLength());
在這種情況下,「本地」 fsin
蒸汽上面已經創建之後,org.apache.commons.io.input.BoundedInputStream
類用於,實施「界限」。
UPDATE
顯然,調整是必要只用例一線LineRecordReader
類,超過分割的界限,以確保它讀取完整的最後一行的一個。
關於此問題的更多詳細信息,請參閱earlier question和MAPREDUCE-772的評論。
上面的代碼不會搜索到-1,而是以-1開頭,即前一個字節第一場之後每場比賽開始。當然,TextInputFormat使用的LineRecordReader正如你所說的那樣工作,因爲它總是讀取至少多出一個字節,並且一直延續到行尾。也許-1是爲了解決這個問題。 – PNS 2013-04-24 00:09:13
你能指點我的源/展示此-1尋求行爲的示例 – 2013-04-24 00:25:13
第59行http://javasourcecode.org/html/open-source/hadoop/hadoop-1.0.3/org/apache/hadoop/mapreduce/ lib/input/LineRecordReader.java.html並不尋求開始 - 1 ... – 2013-04-24 00:27:30