亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Hfile存儲(chǔ)結(jié)構(gòu)

系統(tǒng) 1921 0

轉(zhuǎn)自淘寶數(shù)據(jù)平臺(tái)

?

HBase中的所有數(shù)據(jù)文件都存儲(chǔ)在Hadoop HDFS文件系統(tǒng)上,主要包括兩種文件類型:

1.?HFile, HBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式,HFile是Hadoop的二進(jìn)制格式文件,實(shí)際上StoreFile就是對(duì)HFile做了輕量級(jí)包裝,即StoreFile底層就是HFile

2.?HLog File,HBase中WAL(Write Ahead Log) 的存儲(chǔ)格式,物理上是Hadoop的Sequence File

下面主要通過代碼理解一下HFile的存儲(chǔ)格式。

HFile

下圖是HFile的存儲(chǔ)格式:

Hfile存儲(chǔ)結(jié)構(gòu)

HFile由6部分組成的,其中數(shù)據(jù)KeyValue保存在Block 0 … N中,其他部分的功能有:確定Block Index的起始位置;確定某個(gè)key所在的Block位置(如block index);判斷一個(gè)key是否在這個(gè)HFile中(如Meta Block保存了Bloom Filter信息)。具體代碼是在HFile.java中實(shí)現(xiàn)的,HFile內(nèi)容是按照從上到下的順序?qū)懭氲模―ata Block、Meta Block、File Info、Data Block Index、Meta Block Index、Fixed File Trailer)。

KeyValue: HFile里面的每個(gè)KeyValue對(duì)就是一個(gè)簡(jiǎn)單的byte數(shù)組。但是這個(gè)byte數(shù)組里面包含了很多項(xiàng),并且有固定的結(jié)構(gòu)。我們來看看里面的具體結(jié)構(gòu):

開始是兩個(gè)固定長(zhǎng)度的數(shù)值,分別表示Key的長(zhǎng)度和Value的長(zhǎng)度。緊接著是Key,開始是固定長(zhǎng)度的數(shù)值,表示RowKey的長(zhǎng)度,緊接著是 RowKey,然后是固定長(zhǎng)度的數(shù)值,表示Family的長(zhǎng)度,然后是Family,接著是Qualifier,然后是兩個(gè)固定長(zhǎng)度的數(shù)值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這么復(fù)雜的結(jié)構(gòu),就是純粹的二進(jìn)制數(shù)據(jù)了。

Data Block: 由DATABLOCKMAGIC和若干個(gè)record組成,其中record就是一個(gè)KeyValue(key length, value length, key, value),默認(rèn)大小是64k,小的數(shù)據(jù)塊有利于隨機(jī)讀操作,而大的數(shù)據(jù)塊則有利于scan操作,這是因?yàn)樽xKeyValue的時(shí)候,HBase會(huì)將查詢到的data block全部讀到Lru Block Cache中去,而不是僅僅將這個(gè)record讀到cache中去。

private void append(final byte [] key, final int koffset, final int klength, final byte [] value, final int voffset, final int vlength) throws IOException {

this.out.writeInt(klength);

this.keylength += klength;

this.out.writeInt(vlength);

this.valuelength += vlength;

this.out.write(key, koffset, klength);

this.out.write(value, voffset, vlength);

}

Meta Block: 由METABLOCKMAGIC和Bloom Filter信息組成。

public void close() throws IOException {

if (metaNames.size() > 0) {

for (int i = 0 ; i < metaNames.size() ; ++ i ) {

dos.write( METABLOCKMAGIC );

metaData.get(i).write(dos);

}

}

}

File Info:? 由MapSize和若干個(gè)key/value,這里保存的是HFile的一些基本信息,如hfile.LASTKEY, hfile.AVG_KEY_LEN, hfile.AVG_VALUE_LEN, hfile.COMPARATOR。

private long writeFileInfo(FSDataOutputStream o) throws IOException {

if (this.lastKeyBuffer != null) {

// Make a copy.? The copy is stuffed into HMapWritable.? Needs a clean

// byte buffer.? Won’t take a tuple.

byte [] b = new byte[this.lastKeyLength];

System. arraycopy (this.lastKeyBuffer, this.lastKeyOffset, b, 0, this.lastKeyLength);

appendFileInfo (this.fileinfo, FileInfo. LASTKEY , b, false);

}

int avgKeyLen = this.entryCount == 0? 0: (int)(this.keylength/this.entryCount);

appendFileInfo (this.fileinfo, FileInfo. AVG_KEY_LEN , Bytes. toBytes (avgKeyLen), false);

int avgValueLen = this.entryCount == 0? 0: (int)(this.valuelength/this.entryCount);

appendFileInfo (this.fileinfo, FileInfo. AVG_VALUE_LEN ,

Bytes. toBytes (avgValueLen), false);

appendFileInfo (this.fileinfo, FileInfo. COMPARATOR , Bytes. toBytes (this.comparator.getClass().getName()), false);

long pos = o.getPos();

this.fileinfo.write(o);

return pos;

}

Data/Meta Block Index: ?由INDEXBLOCKMAGIC和若干個(gè)record組成,而每一個(gè)record由3個(gè)部分組成 — block的起始位置,block的大小,block中的第一個(gè)key。

static long writeIndex(final FSDataOutputStream o, final List<byte []> keys, final List<Long> offsets, final List<Integer> sizes) throws IOException {

long pos = o.getPos();

// Don’t write an index if nothing in the index.

if (keys.size() > 0) {

o.write( INDEXBLOCKMAGIC );

// Write the index.

for (int i = 0; i < keys.size(); ++i) {

o.writeLong(offsets.get(i).longValue());

o.writeInt(sizes.get(i).intValue());

byte [] key = keys.get(i);

Bytes. writeByteArray (o, key);

}

}

return pos;

}

Fixed file trailer: ?大小固定,主要是可以根據(jù)它查找到File Info, Block Index的起始位置。

public void close() throws IOException {

trailer.fileinfoOffset = writeFileInfo(this.outputStream);

trailer.dataIndexOffset = BlockIndex.writeIndex(this.outputStream,

this.blockKeys, this.blockOffsets, this.blockDataSizes);

if (metaNames.size() > 0) {

trailer.metaIndexOffset = BlockIndex.writeIndex(this.outputStream,

this.metaNames, metaOffsets, metaDataSizes);

}

trailer.dataIndexCount = blockKeys.size();

trailer.metaIndexCount = metaNames.size();

trailer.totalUncompressedBytes = totalBytes;

trailer.entryCount = entryCount;

trailer.compressionCodec = this.compressAlgo.ordinal();

trailer.serialize(outputStream);

}

注:上面的代碼剪切自HFile.java中的代碼,更多信息可以查看Hbase源代碼。

參考: http://www.searchtb.com/2011/01/understanding-hbase.html

http://th30z.blogspot.com/2011/02/hbase-io-hfile.html

Hfile存儲(chǔ)結(jié)構(gòu)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 精品国产日韩亚洲一区二区 | 欧美人一级淫片a免费播放 欧美人与zoxxxx另类9 | 日本在线观看不卡免费视频 | 激情综合五月亚洲婷婷 | 九九这里只精品视在线99 | 写真福利 第 页 在线视频 | 亚洲视频在线网 | 国产精品人成福利视频 | 精品成人免费一区二区在线播放 | 欧美激情视频二区 | 亚洲欧美日韩综合二区三区 | 黄色网址中文字幕 | 正在播放亚洲一区 | 又刺激又黄的一级毛片 | 国产香蕉尹人综合在线 | 久久精品综合网 | 国产在线欧美日韩一区二区 | 欧美日韩国产高清一区二区三区 | 热久久影院 | 欧美一级α片毛片免费观看 | 成熟女人50岁一级毛片不卡 | 国产91在线 | 日韩 | 福利视频专区 | 日本老熟妇激情毛片 | 亚洲日本va中文字幕区 | 国产精品久久久久久久久免费 | 九九热在线免费 | 亚洲乱码国产乱码精品精98 | 97色老99久久九九爱精品 | 久久久一区二区三区 | 综合久久久 | 欧美三级一区二区 | 国产在线拍国产拍拍偷 | 国产福利视频在线播放 | 在线人成精品免费视频 | 亚洲高清美女一区二区三区 | 成人a毛片免费视频观看 | 国产精品国产自线在线观看 | 波多野野结衣1区二区 | 国产福利视频精品 | 欧美三级美国一级 |