我是靠谱客的博主 清新月亮,最近开发中收集的这篇文章主要介绍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工具从文件中读取,将数据块放入缓存中返回。


最后

以上就是清新月亮为你收集整理的Region中的数据操作之HFile读写的全部内容,希望文章能够帮你解决Region中的数据操作之HFile读写所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部