Region中的数据操作之HFile读写

HFile包含8种类型的数据,分别为KV数据、KV数据索引、Bloom数据、Bloom数据索引、元数据、元数据索引、FileInfo、Trailer。KV数据索引是两层或三层结构、Bloom数据索引和元数据索引是一层。Trailer类型的数据直接序列化写入HFile末尾,其他类型的数据均以文件块的形式写入HFile。

HFile文件分为四个区域,不同区域的数据读写方式不同。如下图所示,分别为扫描区、非扫描区、打开加载区、Trailer。扫描区数据迭代访问,打开加载区数据在文件打开时便加载入内存。不同类型的数据按访问方式存放在相应的区域,KV数据存放于扫描区,KV数据索引的不同层的索引访问方式不同,叶节点存放于扫描区、中间节点存放于非扫描区、根节点存放于打开加载区。Bloom数据存放于扫描区。Bloom数据索引存放于打开时加载区。元数据存放于非扫描区。元数据索引存放于打开加载区。FileInfo存放于打开加载区。Trailer存放于Trailer区。


写HFile

Hbase定义了Writer类进行写HFile操作。指定路径创建一个Writer对象,循环调用调用Writer.append(KeyValue)方法将KeyValue传递给Writer,通过Writer.appendFileInfo(byte[], byte[])中添加元数据,最后调用Writer.close()将所有数据刷新到HFile文件结束写操作。
Writer内有多个对象用来构建不同类型的数据块,对象名及作用见下表。当数据块填满数据时会被写入HFile。


上表中的对象除trailer外记录数据量达到一个块大小时,借助HFileBlock.Writer填充块,然后将块写入HFile文件。HFileBlock.Writer工作机制比较简单,首先创建一个内存输出流,将块信息填入流中,然后再填入数据。填完后将输出流中的数据写入HFile文件中。同一个Writer中只有一个HFileBlock.Writer对象,对象名为fsBlockWriter。
在调用Writer.close()之前,Writer只会向HFile中扫描区中写入数据,调用Writer.close()后将剩余数据写入HFile文件中。Writer.append(KeyValue)和Writer.close()操作流程见下面两张图。



读HFile

Hbase使用HFileReaderV2读取HFile数据。HFileReaderV2对象是线程共享的,不会维护任何读取状态信息。
在HFileReaderV2内部使用不同的对象读取HFile中不同类型的信息,对象说明见下表:



要读HFile文件中的数据,先要从文件末尾读取Trailer,构造Trailer对象,然后创建HFileReaderV2对象。Reader在构造过程中创建dataBlockIndexReader、metaBlockIndexReader、fileInfo对象,加载剩下的打开加载区数据。bloom过滤器需要调用Reader对象的函数进行创建。
读取KeyValue时,首先从索引信息中确定KeyValue所在的块,然后调用HFileReaderV2.readBlock读取数据块。HFileReaderV2.readBlock首先从缓存中寻找数据块,若没有则使用HFileBlock.FSReader工具从文件中读取,将数据块放入缓存中返回。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值