概述
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
在HFileReaderV2内部使用不同的对象读取HFile中不同类型的信息,对象说明见下表:
读取KeyValue时,首先从索引信息中确定KeyValue所在的块,然后调用HFileReaderV2.readBlock读取数据块。HFileReaderV2.readBlock首先从缓存中寻找数据块,若没有则使用HFileBlock.FSReader工具从文件中读取,将数据块放入缓存中返回。
最后
以上就是清新月亮为你收集整理的Region中的数据操作之HFile读写的全部内容,希望文章能够帮你解决Region中的数据操作之HFile读写所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复