Hello,
One HFile consists of many blocks. Suppose we have two blocks, b1 and
b2. The size of each block is 2K. In b1, we have two key-value pairs,
whose keys are t1 and t2, separately. Each key-value pair is 1K. So
the b1 is full. Suppose that now we insert a new tuple which key is
also t1. The HBase will call the HFile.Writer.append(kv) method to
insert t1 into b2, because b1 is full. This is how I understand
HFile.Writer.append() operation. But when I write a test program as
follows:
//block size is 2K
HFile.Writer hwriter = new HFile.Writer(fs, new
Path("hdfs://localhost:8020/huyong/test"), 2,
(Compression.Algorithm)null, null);
//key-value 1K
byte[] key2 = "Bim".getBytes();
byte[] value2 = new byte[1024];
for(int i=0;i<1024;i++){
value2[i] = 'b';
}
hwriter.append(key2, value2);
byte[] key3 = "Cim".getBytes();
byte[] value3 = new byte[1024];
for(int i=0;i<1024;i++){
value3[i] = 'c';
}
hwriter.append(key3, value3);
byte[] key4 = "Bim".getBytes();
byte[] value4 = new byte[1024];
for(int i=0;i<1024;i++){
value4[i] = 'b';
}
hwriter.append(key4, value4);
Then, I get the following error information:
Added a key not lexically larger than previous key=Bim, lastkey=Cim
So it seems that the key order in all blocks is ascendant, the key in
the first block is smaller than the second one. But if I want to
insert a tuple which key is as same as the previous block, but
previous block has no room for that key-value, what will happen?
Thanks!
Yong