在Hadoop 0.20.1版本釋出後,它多了一個名為「TFile」的Binary File Format,因為當初設計「SequenceFile」的Block Compression格式過於複雜,所以重新設計了這個「TFile」檔案格式,同時它也俱備了較佳的效能、可擴充性和語言的中立性(意指不會看到Java中的package名稱,可參考筆者先前po文「Hadoop - Uncompressed SequenceFile Format 詳解」),更多的詳細細節可參考HADOOP-3315。
基本上一個TFile storage format是由兩個部份所組成的:一個是Block Compressed File layer (簡稱BCFile),另一個為TFile-specific <key,value> management layer(這部份未來也許會逐漸地擴充)。而一個BCFile storage layout是由五個部份所組成,它們分別為:
(1)a 16-byte magic.
(2)a data section that consists of a sequence of Data Blocks.
(3)a meta section that consists of a sequence of Meta Blocks.
(4)a Meta Block index section (“Meta Index”).
(5)a tail section.
這裡筆者直接測試一個範例:
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.file.tfile.TFile;
public class TFileWriter
{
private static final String[] DATA = {"One","Two"};
public static void main(String[] args) throws IOException
{
String uri = "hdfs://shen:9000/user/shen/test.tfile";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
fs.delete(new Path("test.tfile"), true);
Path path = new Path(uri);
FSDataOutputStream fdos = fs.create(path, true);
TFile.Writer writer = new TFile.Writer(fdos, 1024*128, TFile.COMPRESSION_NONE, null , conf);
for (int i = 0; i < DATA.length; i++)
{
writer.append(new byte[]{(byte)i}, DATA[i].getBytes());
}
writer.close();
}
}
在這個範例中只會有兩筆Record,它們分別為:<0,'One'>和<1,'Two'>,最後輸出成TFile檔案格式,如下圖:
P.S. 下圖筆者用「紅→綠→藍」顏色區隔BCFile storage layout所組成的五個部份。
